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);
-
- }
复制代码
a.h内容: - #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;
- }
复制代码
b.h内容 - #ifndef B_H_
- #define B_H_
- #include <opencv2/opencv.hpp>
- class B
- {
- public:
- void readImg(char* path);
- };
-
- #endif
复制代码
main.cpp内容 - //main.cpp
- #include "a.h"
-
- int main()
- {
- char *path =(char*) "test.jpg";
- A a;
- a.readImg(path);
- return 0;
- }
复制代码
CMakeLists.txt内容: - 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
第二种执行方式:
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以后在make生成可执行文件main,说明编译成功。
执行./main
|