我正在使用Eclipse C++中的Windows。我有这样的结构在我的项目:创建一个可执行封装2个其他项目
subProject A
-> creates a static library (works fine)
subProject B encapsulating subproject A
-> creates a static library (works fine)
subProject TestA
-> creates an executable (works fine)
subProject TestB
|dev
|src
| CmakeList.txt
|CmakeList.txt
-> creates an executable (doesn't work)
这是CmakeList.txt在为TESTB可执行dev目录:
set(${PROJECT_NAME}_INCLUDE_DIRS
$(CMAKE_CURRENT_SOURCE_DIR}/src
CACHE STRING "" FORCE)
include_directories(${${PROJECT_NAME}_INCLUDE_DIRS})
file(GLOB_RECURSE ${PROJECT_NAME}_HEADER_FILES FOLLOW_SYMLINKS
./*.hpp
./*.h)
file(GLOB_RECURSE ${PROJECT_NAME}_SORUCE_FILES FOLLOW_SYMLINKS
./*.cpp
./*.c)
set(${PROJECT_NAME}_FILES ${${PROJECT_NAME}_HEADER_FILES}
${${PROJECT_NAME}_SOURCE_FILES})
# Additional includes and link directories and dependencies
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../../install/${CMAKE_BUILD_TYPE}/A/include)
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../../install/${CMAKE_BUILD_TYPE}/B/include)
if(${CMAKE_BUILD_TYPE} STREQUAL "Release")
set(${PROJECT_NAME}_EXTRA_LIBRARIES ${${PROJECT_NAME}_EXTRA_LIBRARIES}
A
B
pthread)
elseif(${CMAKE_BUILD_TYPE} STREQUAL "Debug")
set(${PROJECT_NAME}_EXTRA_LIBRARIES ${${PROJECT_NAME}_EXTRA_LIBRARIES}
A
B
pthread)
endif()
# Add a library to the project
link_directories(${CMAKE_CURRENT_SOURCE_DIR}/../../install/${CMAKE_BUILD_TYPE}/A/lib)
link_directories(${CMAKE_CURRENT_SOURCE_DIR}/../../install/${CMAKE_BUILD_TYPE}/B/lib)
add_executable(${PROJECT_NAME} ${${PROJECT_NAME}_FILES})
target_link_libraries(${PROJECT_NAME} ${${PROJECT_NAME}_EXTRA_LIBRARIES})
install(FILES ${${PROJECT_NAME}_HEADER_FILES}
DESTINATION ${CMAKE_INSTALL_PREFIX}/include/
PERSMISSIONS OWNER_READ GROUP_READ WORLD_READ)
install(TARGETS ${PROJECT_NAME}
ARCHIVE DESTINATION lib
LIBRARY DESTINATION lib
RUNTIME DESTINATION bin)
在我的乙子项目,在文件中,我有这样的:
#include "A.hpp"
...
A algo;
A.method(parameters)
当我建立我的TESTB,我对2号线出现在B类项目 AB这个奇怪的错误奥雅纳这使得我的生成失败:
undefined reference to A::A()
undefined reference to A::method(parameter)
当我发表意见,这些线路和重建B类项目和TESTB项目它工作得很好,我在B项目库,并在一个.exe文件TESTB。
我不明白我的问题在哪里。
如果使用'A',你需要对静态链接库项目A产生。 – StoryTeller
我不太明白在哪里链接和如何。在我的CmakeList.txt中?是不是'link_directories($ {CMAKE_CURRENT_SOURCE_DIR} /../../ install/$ {CMAKE_BUILD_TYPE}/A/lib)'命令已经链接了它? – user3314570
不知道,是静态库的建立和位置?我还建议你尝试将两个'link_directories'命令合并成一个。这就是[cmake文档所做的](https://cmake.org/cmake/help/v3.0/command/link_directories.html)。这可能是第二个电话会丢掉第一个电话。 – StoryTeller