2017-01-07 10 views
1

CのプロジェクトAをメインプログラム、プロジェクトBを共有オブジェクト(.so)のモジュールとします。プロジェクトAは、両方のプロジェクトで共通のソースとヘッダーで構成されています。プロジェクト実行時にロードモジュールの.soファイル。モジュラープロジェクト用のCMakeファイルを正しく作成する方法

プロジェクト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 

方法CA n CMakeファイルを使用してプロジェクトBに正しく依存関係を追加し、このエラーを解決しますか? (実際に私のnetbeans C++プロジェクトをJetbrains CLionに変更したい)

+0

参照[CMakeの/チュートリアル/ターゲットのエクスポートとインポート](https://cmake.org/Wiki/CMake/Tutorials/Exporting_and_Importing_Targets#Importing_Targets):私の問題は、cmakeのファイルをプロジェクトにこの行を追加することで解決しました。あなたはプロジェクトAのCMakeファイルにプロジェクトBを認識させる必要があります。いくつかの方法がありますので、おそらく 'add_library(ProjectB SHARED IMPORTED GLOBAL) 'で始まるものを追加するでしょう。... – Florian

+0

@Florian:ありがとう。私はあなたが言ったことをして、私の問題は解決しました。 :) – mitrc

答えて

1

his commentのおかげで。

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