1.最初にファイル形式を確認します
その中で、cpp1は、.cppが直接呼び出され、.soが生成されるフォルダーです。
cpp2は、テストによって生成された.soで使用できるフォルダーです。
2.最初に.cppを直接コンパイルして、コードに問題がないことを確認します
a.cppコンテンツ:
#include <iostream>
#include "a.h"
void A::readImg(char* path)
{
B b;
b.readImg(path);
}
ああ内容:
#ifndef A_H_
#define A_H_
#include "b.h"
class A
{
public:
A(){}
~A(){}
void readImg(char* path);
};
#endif
b.cppコンテンツ:
#include "b.h"
void B::readImg(char* path)
{
cv::Mat img = cv::imread(path);
std::cout<<"图像宽为:"<<img.cols<<"\t高度为:"<<img.rows<<"\t通道数为:"<<img.channels()<<std::endl;
}
bhコンテンツ
#ifndef B_H_
#define B_H_
#include <opencv2/opencv.hpp>
class B
{
public:
void readImg(char* path);
};
#endif
cmake_minimum_required(VERSION 2.6)
project(cpp1)
add_definitions(-std=c++11)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_BUILD_TYPE Debug)
find_package(OpenCV REQUIRED)
include_directories(OpenCV_INCLUDE_DIRS)
add_executable(main ${PROJECT_SOURCE_DIR}/main.cpp a.cpp b.cpp)
target_link_libraries(main ${OpenCV_LIBS})
add_definitions(-O2 -pthread)
makeの後、実行可能ファイルmainが生成され、次の情報を出力して、コード全体に問題がないことを示します。
./mainを実行します
3.cpp2の.soファイルを呼び出します
まず、cpp1の下に.soファイルを生成します(.soファイルはlibで始まり、使用する場合はlibを削除する必要があることに注意してください)。
g++ -fpic -shared -o libCPP1.so a.cpp b.cpp -I /usr/local/include -L /usr/local/lib -lopencv_core -lopencv_highgui
libCPP1.soファイルを生成します。
新しいcpp2フォルダーを作成し、cpp1のmain.cpp、.hファイルおよびlibCPP1.soをコピーします。
実行の最初の方法:
g++ -o ./main -std=c++11 main.cpp -L ./ -lCPP1
実行可能ファイルmainを生成して印刷すると、結果が同じであることがわかり、生成された.soファイルが成功したことを示します。
./mainを実行します
実行の2番目の方法:
CMakeLists.txtコンテンツ:生成された.soパスをリンク可能なライブラリとして使用します
cmake_minimum_required(VERSION 2.6)
project(cpp2)
add_definitions(-std=c++11)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_BUILD_TYPE Debug)
# find_package(OpenCV REQUIRED)
# include_directories(OpenCV_INCLUDE_DIRS)
add_executable(main ${PROJECT_SOURCE_DIR}/main.cpp)
# target_link_libraries(main ${OpenCV_LIBS})
target_link_libraries(main ${OpenCV_LIBS} /home/fzh/AI/learn_cplus/learn_some_api/cpp2/libCPP1.so)
add_definitions(-O2 -pthread)
cmakeの後、実行可能ファイルmainがmakeで生成され、コンパイルが成功したことを示します。
./mainを実行します