[C.C++] c++将.cpp编译为.so文件

383 0
Honkers 2026-4-8 01:07:17 来自手机 | 显示全部楼层 |阅读模式

1.首先看文件形式 

其中cpp1是直接调用.cpp和生成.so的文件夹。

cpp2是测试生成的.so可以使用的文件夹。

2.先直接编译.cpp检查代码没问题

a.cpp内容:

  1. #include <iostream>
  2. #include "a.h"
  3. void A::readImg(char* path)
  4. {
  5. B b;
  6. b.readImg(path);
  7. }
复制代码

a.h内容:

  1. #ifndef A_H_
  2. #define A_H_
  3. #include "b.h"
  4. class A
  5. {
  6. public:
  7. A(){}
  8. ~A(){}
  9. void readImg(char* path);
  10. };
  11. #endif
复制代码

b.cpp内容:

  1. #include "b.h"
  2. void B::readImg(char* path)
  3. {
  4. cv::Mat img = cv::imread(path);
  5. std::cout<<"图像宽为:"<<img.cols<<"\t高度为:"<<img.rows<<"\t通道数为:"<<img.channels()<<std::endl;
  6. }
复制代码

b.h内容

  1. #ifndef B_H_
  2. #define B_H_
  3. #include <opencv2/opencv.hpp>
  4. class B
  5. {
  6. public:
  7. void readImg(char* path);
  8. };
  9. #endif
复制代码

main.cpp内容

  1. //main.cpp
  2. #include "a.h"
  3. int main()
  4. {
  5. char *path =(char*) "test.jpg";
  6. A a;
  7. a.readImg(path);
  8. return 0;
  9. }
复制代码

CMakeLists.txt内容:

  1. cmake_minimum_required(VERSION 2.6)
  2. project(cpp1)
  3. add_definitions(-std=c++11)
  4. set(CMAKE_CXX_STANDARD 11)
  5. set(CMAKE_BUILD_TYPE Debug)
  6. find_package(OpenCV REQUIRED)
  7. include_directories(OpenCV_INCLUDE_DIRS)
  8. add_executable(main ${PROJECT_SOURCE_DIR}/main.cpp a.cpp b.cpp)
  9. target_link_libraries(main ${OpenCV_LIBS})
  10. add_definitions(-O2 -pthread)
复制代码

make以后生成可执行文件main,可打印如下信息,说明整个代码都是没问题的。 

执行./main

3.在cpp2调用.so文件

首先在cpp1下生成.so文件(注意.so文件要以lib开头,在使用的时候要把lib去掉)

  1. 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拷贝进来。

第一种执行方式:

  1. g++ -o ./main -std=c++11 main.cpp -L ./ -lCPP1
复制代码

即可生成可执行文件main,打印一下,发现结果一样,说明生成的.so文件成功.

执行./main

第二种执行方式:

CMakeLists.txt内容: 将生成的.so路径作为可链接库

  1. cmake_minimum_required(VERSION 2.6)
  2. project(cpp2)
  3. add_definitions(-std=c++11)
  4. set(CMAKE_CXX_STANDARD 11)
  5. set(CMAKE_BUILD_TYPE Debug)
  6. # find_package(OpenCV REQUIRED)
  7. # include_directories(OpenCV_INCLUDE_DIRS)
  8. add_executable(main ${PROJECT_SOURCE_DIR}/main.cpp)
  9. # target_link_libraries(main ${OpenCV_LIBS})
  10. target_link_libraries(main ${OpenCV_LIBS} /home/fzh/AI/learn_cplus/learn_some_api/cpp2/libCPP1.so)
  11. add_definitions(-O2 -pthread)
复制代码

cmake以后在make生成可执行文件main,说明编译成功。

执行./main

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

中国红客联盟公众号

联系站长QQ:5520533

admin@chnhonker.com
Copyright © 2001-2026 Discuz Team. Powered by Discuz! X3.5 ( 粤ICP备13060014号 )|天天打卡 本站已运行