2016-09-05 62 views
1

我正在使用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。

我不明白我的问题在哪里。

+0

如果使用'A',你需要对静态链接库项目A产生。 – StoryTeller

+0

我不太明白在哪里链接和如何。在我的CmakeList.txt中?是不是'link_directories($ {CMAKE_CURRENT_SOURCE_DIR} /../../ install/$ {CMAKE_BUILD_TYPE}/A/lib)'命令已经链接了它? – user3314570

+0

不知道,是静态库的建立和位置?我还建议你尝试将两个'link_directories'命令合并成一个。这就是[cmake文档所做的](https://cmake.org/cmake/help/v3.0/command/link_directories.html)。这可能是第二个电话会丢掉第一个电话。 – StoryTeller

回答

1

B依赖于A,所以将B的CMakeLists.txt中的依赖关系添加到A中,其中target_link_libraries。即使它是一个静态库,并且在生成B时也不会有任何实际链接,但无论如何,这将提示CMake每次将B链接到可执行文件时,还必须链接之后AA必须位于链接命令行中的B之后,以便在链接到A时知道B所需的符号。有关更多详细信息,请参阅here

如果你正在寻找一个快速解决,而不是,只是改变:

set(${PROJECT_NAME}_EXTRA_LIBRARIES ${${PROJECT_NAME}_EXTRA_LIBRARIES} 
        A 
        B 
        pthread) 

这个

set(${PROJECT_NAME}_EXTRA_LIBRARIES ${${PROJECT_NAME}_EXTRA_LIBRARIES} 
        B 
        A 
        pthread) 
+0

谢谢,我现在明白了。有效! – user3314570

相关问题