2016-09-05 3 views
1

私はEclipse C++でWindows上で作業しています。ファイルには、私が持っている、私のBサブプロジェクトで実行可能ファイルを作成して他の2つのプロジェクトをカプセル化する

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) 

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) 

これはTESTB実行可能ファイルのdevディレクトリ内CmakeList.txtです:私は私のプロジェクトでは、この構造を持っていますこの:

#include "A.hpp" 

... 
A algo; 
A.method(parameters) 

私はTESTBを構築するとき、私はAB 2行にBプロジェクトに登場する、この奇妙なエラーが発生しています私のビルドは失敗しますOVE:

undefined reference to A::A() 
undefined reference to A::method(parameter) 

私はこれらの行をコメントアウトしてBプロジェクトTESTBプロジェクトそれが正常に動作を再構築するとき、私はBプロジェクトのライブラリとで.exeファイルを持っていますTestB。

私はどこに問題があるのか​​分かりません。

+0

にあなたが 'A'を使用する場合は、プロジェクトの静的ライブラリとリンクする必要があります生成する。 – StoryTeller

+0

私はそれをどこにリンクするのか、それをどう理解できませんでした。私のCmakeList.txtに? 'link_directories($ {CMAKE_CURRENT_SOURCE_DIR} /../../ install/$ {CMAKE_BUILD_TYPE}/A/lib)'コマンドは既にそれをリンクしていますか? – user3314570

+0

静的ライブラリが構築されている場所はどこですか? 2つの 'link_directories'コマンドを1つにすることをお勧めします。それは[cmakeのドキュメントが行うこと](https://cmake.org/cmake/help/v3.0/command/link_directories.html)です。 2番目のコールが最初のコールをスローしている可能性があります。 – StoryTeller

答えて

1

BAに依存するので、BのCMakeLists.txtの依存関係をtarget_link_librariesでAに追加します。たとえそれが静的ライブラリであり、Bをビルドするときに実際のリンクがなくても、これはBを実行可能ファイルにリンクするたびにからAにリンクする必要があることをCMakeに示唆します。 Aにリンクすると、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

関連する問題