【发布时间】:2017-05-22 00:58:24
【问题描述】:
假设 C++ 项目 A 作为我的主程序,项目 B 是我的共享对象 (.so) 模块。项目 A 包含两个项目之间通用的源和标头。项目A在运行时加载模块.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/)
但是在项目运行时会出现如下错误:
undefined symbol: _ZN6class-AI4funcAEv
如何使用 CMake 文件正确地将依赖项添加到项目 B 并解决此错误? (其实我想把我的netbeans C++项目改成Jetbrains CLion)
【问题讨论】:
-
见CMake/Tutorials/Exporting and Importing Targets。您需要让 Project A CMake 文件知道 Project B。有几种方法,所以我可能会添加一些以
add_library(ProjectB SHARED IMPORTED GLOBAL)开头的内容... -
@Florian:谢谢兄弟。我按照你说的做了,我的问题解决了。 :)
标签: c++ cmake netbeans-8 clion