How to correctly create a CMake file for a modular project

匆匆过客 提交于 2019-12-11 04:56:59

问题


Suppose C++ project A as my main program and project B is my module that is shared object (.so). Project A consist source and headers that is common between both projects. Project A load module .so file in runtime.

Project 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

Project B: (Shared Object)

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

With following CMake files both project build successfully.

Project 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/)

Project 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/)

But at runtime Project A following error will be appear:

undefined symbol: _ZN6class-AI4funcAEv

How can I add dependency to project B correctly using CMake file and solve this error? (Actually I want to change my netbeans C++ project to Jetbrains CLion)


回答1:


Thanks to Florian for his comment. My problem solved with adding this lines to Project A CMake file:

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


来源:https://stackoverflow.com/questions/41519666/how-to-correctly-create-a-cmake-file-for-a-modular-project

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!