c++ - 如何为模块化项目正确创建 CMake 文件

标签 c++ cmake netbeans-8 clion

假设 C++ 项目 A 作为我的主程序,项目 B 是我的共享对象 (.so) 模块。项目 A 包含两个项目之间通用的源代码和 header 。 Project 运行时加载模块.so文件。

项目 A:

class-AI.cpp (It contains function funcA)
class-AI.h

class-AII.cpp
class-AII.h

class-AIII.cpp
class-AIII.h

main.cpp

项目 B:(共享对象)

class-BI.cpp (Its inherit from class-AI)
class-BI.h

使用以下 CMake 文件,两个项目都成功构建。

项目 A CMakefile:

cmake_minimum_required(VERSION 3.6)
project(ProjectA)

set(CMAKE_CXX_STANDARD 11)

set(SOURCE_FILES
        main.cpp
        class-AI.cpp
        class-AI.h
        class-AII.cpp
        class-AII.h
        class-AIII.cpp
        class-AIII.h)

add_executable(ProjectA ${SOURCE_FILES})

set(EXECUTABLE_OUTPUT_PATH /opt/ProjectA/bin/)

项目 B CMakefile:

cmake_minimum_required(VERSION 3.6)
project(ProjectB)

set(CMAKE_CXX_STANDARD 11)

set(SOURCE_FILES class-BI.cpp class-BI.h)
add_library(ProjectB SHARED ${SOURCE_FILES})    
set_target_properties(ProjectB PROPERTIES
        PREFIX ""
        LIBRARY_OUTPUT_DIRECTORY /opt/ProjectA/bin/)

但是在运行时Project会出现如下错误:

undefined symbol: _ZN6class-AI4funcAEv

如何使用CMake文件正确添加项目B的依赖并解决这个错误? (实际上我想将我的 netbeans C++ 项目更改为 Jetbrains CLion)

最佳答案

感谢Florian对于 his comment .通过将此行添加到 Project A CMake 文件中解决了我的问题:

add_library(ProjectB SHARED IMPORTED GLOBAL)
set_target_properties(ProjectB PROPERTIES IMPORTED_LOCATION "/opt/ProjectA/bin/ProjectB.so")
target_link_libraries(ProjectA ProjectB)

关于c++ - 如何为模块化项目正确创建 CMake 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41519666/

相关文章:

c++ - 如何为模板函数实现容器和迭代器的重载?

visual-studio-code - 如何让vscode自动使用cmake include路径

javascript - 如何折叠 switch 中案例的代码?

java - 有没有办法使用 NetBeans IDE 将代码块引入到新生成的类的方法中?

CMake find_package 对子项目的依赖

java - 如何在 Java 中调试 Thread.start()

c++ - STL 中的继承问题

c++ - Opencv:EM算法训练缓慢

c++ - 如何使用标准 C++ 将 C 字符串转换为 XML?

Cmake 覆盖给定目标的 find_package