2017-01-14 15 views
1

私のプロジェクトは~/SimGrid/libディレクトリに依存関係ライブラリを持っています。 CMakeLists.txtに正しく追加するにはどうすればよいですか?libfilesにパスを正しく追加する方法は?

は、今私はlink_directories(/home/whoami/SimGrid/lib)しようと、それは解決しないと得られます。

[ 5%] Linking CXX executable CSim2Sim 
/usr/bin/ld: cannot find -lsimgrid 
collect2: error: ld returned 1 exit status 

マイCMakeLists.txtはここにあるフル:

project(CSim2Sim) 

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -g -O0") 

set(SOURCE_FILES src/main.cpp) 
add_executable(CSim2Sim ${SOURCE_FILES}) 

include_directories(/home/whoami/SimGrid/include) 
link_directories(/home/whoami/SimGrid/lib) 

target_link_libraries(CSim2Sim simgrid) 
+0

参照[どのように私は.soのファイルのライブラリ名を見つけることができますか?](http://stackoverflow.com/questions/40342705/how-can-i-find-a-library-nameを参照してください。 -of-so-file/40343060#40343060) –

答えて

1

、リンカがライブラリファイル名は「LIB」を前置されることを想定してい:

/home/whoami/SimGrid/lib/libsimgrid.so 

あなたのライブラリファイルは、そのような接頭辞を持っていない場合、それはプレーンなライブラリ名を使用して、リンカによって発見することができません

として反対、target_link_librariesコールにフルライブラリファイル名を指定すると、常に動作します:

# Assume filename of the library is 'simgrid.so' 
target_link_libraries(CSim2Sim /home/whoami/SimGrid/lib/simgrid.so) 

その場合link_directories()コールは必要ありません。

1

link_directoriesライブラリだけ内側に探すために何のディレクトリにCMakeを伝えますあなたはリンクしたいライブラリではなく、リンクしたいものです。私の提案はSimGrid.cmakeという名前のファイルを作成し、以下を追加することです:あなたCMakeLists.txt

# -*- cmake -*- 

set(SIMGRID_INCLUDE_DIRS 
    ${CMAKE_SOURCE_DIR}/SimGrid/include 
    ) 

set(SIMGRID_LIBRARIES 
    simgrid.a 
    simgrid2.a # etc for the names of the actual libs you want to link 
    ) 

で新しいファイルを引っ張ってinclude(SimGrid)を追加

次に、あなたのCmakeLists.txtであり、新たな変数とtarget_link_librariesを使用しています。あなたがリンクに欲しいもののライブラリリンカ伝えるために使用する機能:もちろん

include_directories(${SIMGRID_INCLUDE_DIRS}) 
target_link_libraries(CSim2Sim ${SIMGRID_LIBRARIES}) 

は、あなたは自分の単一にすべてを追加することができます、それを分割することは、物事を管理しやすくするための良い習慣です。 Linuxの

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -g -O0") 

set(SOURCE_FILES src/main.cpp) 
add_executable(CSim2Sim ${SOURCE_FILES}) 

link_directories(${CMAKE_SOURCE_DIR}/SimGrid/lib) 
include_directories(${CMAKE_SOURCE_DIR}/SimGrid/include) 

set(SIMGRID_LIBRARIES 
    simgrid.a 
    simgrid2.a 
    ) 

target_link_libraries(CSim2Sim ${SIMGRID_LIBRARIES}) 
+0

私はあなたのお勧めを 'CMakeLists.txt'に追加しましたが、私は同じエラーがあります。 –

+0

私は '.so'ファイルではなく、' .a'ファイルである可能性がありますか? –

+0

@CinderBiscuits:[target_link_libraries](https://cmake.org/cmake/help/v3.7/command/target_link_libraries.html)で、**相対パス**( 'simgrid.a'など)をライブラリに使用すると*未定義の動作*。むしろ、元のコアは**明確な振る舞い*を持つ**プレーンライブラリ名**( 'simgrid')を使用します。追加のエラーを除いて(あなたの 'SimGrid.cmake'が' include_directories'呼び出しを逃してしまいます)、あなたのアプローチはちょっとしたことがあります。ライブラリ検出のための追加のスクリプトを助言するならば、 'find_package(SimGrid)'に含まれている 'FindSimGrid.cmake'スクリプトがあります。 – Tsyvarev

0

あなたのプロジェクトが依存しているライブラリを探し、それをターゲットにリンクすることをお勧めします。したがって、絶対パスまたは相対パスはcmakeファイルにはなく、cmakeの実行中に検出されます。

How can I find a library name of .so file?

関連する問題