Linux g++コンパイルダイナミックリンクライブラリおよびC++OpenCVエンジニアリング呼び出し


g++ダイナミックリンクライブラリのコンパイル
  • 簡単なダイナミックリンクライブラリ
  • をコンパイル
  • コードとファイルフォーマット
  • コンパイルと呼び出し
  • 1、動的リンクライブラリ
  • を生成する.
  • 2、コンパイル呼び出し生成の動的ライブラリ
  • 3、環境変数パス
  • を追加
  • 4、運転
  • サードパーティライブラリ(opencv)に依存する動的リンクライブラリ
  • をコンパイルする.
  • コードとファイルフォーマット
  • コンパイルと呼び出し
  • 単純なダイナミックリンクライブラリのコンパイル
    コードとファイルフォーマット
    フォルダR 003の下にファイルが存在する-R 003----R 003.h ----R003.cpp ----main.cpp
    1、ヘッダファイル:R 003.h
    #ifndef R003_H_
    #define R003_H_
    extern "C"
    int IF_Security_DLL(const char* ConfigInform, const char* ConfigPath, char*& ConfigCode);
    void Free_ConfigCode_IF_R009(char **rec_result_pureC);
    #endif 
    

    2、ソースファイル:R 003.cpp
    #include "R003.h"
    #include 
    #include 
    #include 
    
    int IF_Security_DLL(const char* ConfigInform, const char* ConfigPath, char*& ConfigCode)
    {
    	std::string Inform = ConfigInform;
    	std::string Path = ConfigPath;
    	std::string Code = "";
    	std::cout << Path.substr(Path.length() - 4, 4) << std::endl;
    	std::cout << Inform.substr(Inform.length() - 5, 5) << std::endl;
    	if (Path.substr(Path.length() - 4, 4) == "Path"&&Inform.substr(Inform.length() - 5, 5) == "IFSSC")
    	{
    		Code = Code + Inform + Path;
    	}
    	else
    	{
    		return 1;
    	}
    	int len = Code.length();
    	std::cout << len << std::endl;
    	char * codeout = (char *)malloc((len + 1) * sizeof(char));
    	//rec_result_pureC_tmp = (char *)malloc(sizeof(char)*len+1);
    	memset(codeout, 0, len + 1);
    	Code.copy(codeout, len);
    	ConfigCode = codeout;
    	return 0;
    }
    
    void Free_ConfigCode_IF_R009(char **rec_result_pureC)
    {
    	if (*rec_result_pureC != NULL)
    	{
    		free(*rec_result_pureC);
    		*rec_result_pureC = NULL;
    	}
    	return;
    }
    

    3、テストファイルを呼び出す:main.cpp
    #define  _CRT_SECURE_NO_WARNINGS
    
    #include "R003.h"
    #include 
    #include 
    
    int main()
    {
    	const char* ConfigInform = "yiqundoushishabi_IFSSC";
    	const char* ConfigPath = "yiqundoushishabi_Path";
    	char* ConfigCode;
    
    	int flag = IF_Security_DLL(ConfigInform, ConfigPath, ConfigCode);
    	
    	std::cout << strlen(ConfigCode) << std::endl;
    	for (int i = 0; i < strlen(ConfigCode); i++)
    	{
    		std::cout << ConfigCode[i];
    	}
    	Free_ConfigCode_IF_R009(&ConfigCode);
    	return 0;
    }
    

    コンパイルと呼び出し
    1、ダイナミックリンクライブラリの生成
    g++ -Wall -g -fPIC -c R003.cpp -o R003.o
    
    g++ -shared R003.o -o libR003.so
    

    上の2つはマージできます
    g++ -Wall -g -fPIC -c R003.cpp -shared -o libR003.so
    

    2、コンパイルコール生成の動的ライブラリ
    g++ -o main main.cpp -L. -lR003
    

    命令ldd mainでmain依存項目を表示できます
    3、環境変数パスの追加
    export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home1/dc/dcstuff/CplusCompile/R003/
    

    4、運転
     ./main
    

    サードパーティ製ライブラリ(opencv)に依存するダイナミックリンクライブラリのコンパイル
    コードとファイルフォーマット
    フォルダR 003 opencvの下にファイルが存在する-R 003----R 003.h ----R003.cpp ----main.cpp ----0.jpg
    1、ヘッダファイル:R 003.h
    #ifndef R003_H_
    #define R003_H_
    
    #include 
    extern "C"
    int IF_Security_DLL(const char* ConfigInform, const char* ConfigPath, char*& ConfigCode);
    void Free_ConfigCode_IF_R009(char **rec_result_pureC);
    void getimage(cv::Mat image);
    #endif
    

    2、ソースファイル:R 003.cpp
    #include "R003.h"
    #include 
    #include 
    #include 
    #include 
    
    int IF_Security_DLL(const char* ConfigInform, const char* ConfigPath, char*& ConfigCode)
    {
    	std::string Inform = ConfigInform;
    	std::string Path = ConfigPath;
    	std::string Code = "";
    	std::cout << Path.substr(Path.length() - 4, 4) << std::endl;
    	std::cout << Inform.substr(Inform.length() - 5, 5) << std::endl;
    	if (Path.substr(Path.length() - 4, 4) == "Path"&&Inform.substr(Inform.length() - 5, 5) == "IFSSC")
    	{
    		Code = Code + Inform + Path;
    	}
    	else
    	{
    		return 1;
    	}
    	int len = Code.length();
    	std::cout << len << std::endl;
    	char * codeout = (char *)malloc((len + 1) * sizeof(char));
    	//rec_result_pureC_tmp = (char *)malloc(sizeof(char)*len+1);
    	memset(codeout, 0, len + 1);
    	Code.copy(codeout, len);
    	ConfigCode = codeout;
    	return 0;
    }
    
    void Free_ConfigCode_IF_R009(char **rec_result_pureC)
    {
    	if (*rec_result_pureC != NULL)
    	{
    		free(*rec_result_pureC);
    		*rec_result_pureC = NULL;
    	}
    	return;
    }
    
    void getimage(cv::Mat image)
    {
      cv::imwrite("1.jpg",image);
    }
    

    3、テストファイルを呼び出す:main.cpp
    #define  _CRT_SECURE_NO_WARNINGS
    
    #include "R003.h"
    #include 
    #include 
    
    
    int main()
    {
    	const char* ConfigInform = "yiqundoushishabi_IFSSC";
    	const char* ConfigPath = "yiqundoushishabi_Path";
    	char* ConfigCode;
    
    	int flag = IF_Security_DLL(ConfigInform, ConfigPath, ConfigCode);
    	
    	std::cout << strlen(ConfigCode) << std::endl;
    	for (int i = 0; i < strlen(ConfigCode); i++)
    	{
    		std::cout << ConfigCode[i];
    	}
    	Free_ConfigCode_IF_R009(&ConfigCode);
      cv::Mat image = cv::imread("0.jpg");
      getimage(image);
    	return 0;
    }
    

    コンパイルと呼び出し
    1、OpenCVのpkgを追加するconfigからパーソナル環境変数は、一般的に/usr/local/lib/x 86_などのインストールパスの下にあります.64-linux-gnu/pkgconfig/在.barshrcに追加:
    export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/x86_64-linux-gnu/pkgconfig
    

    追加完了後の記憶
    source ~/.barshrc
    

    2、コンパイル生成ダイナミックライブラリ
    g++ -Wall -g -fPIC -c R003.cpp $(pkg-config --cflags --libs opencv)  -shared -o libR003.so
    

    3、コンパイルコール生成の動的ライブラリ
    g++ -o main main.cpp $(pkg-config --cflags --libs opencv) -L. -lR003
    

    3、環境変数パスの追加(ldd mainでmainの依存項目を表示できます.先ほど生成したlibR 003.soが見つからない場合は、現在の.soが存在するフォルダを環境変数に追加します)
    export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home1/dc/dcstuff/CplusCompile/R003/
    

    追加完了後の記憶
    source ~/.barshrc
    

    4、実行./main