2017-01-14 4 views
1

Mein Projekt verfügt über eine Abhängigkeitsbibliothek im Verzeichnis ~/SimGrid/lib. Wie kann ich es korrekt zu meiner CMakeLists.txt hinzufügen?Wie man den Pfad zu libfiles korrekt hinzufügt?

Jetzt versuche ich link_directories(/home/whoami/SimGrid/lib), aber es hilft nicht, und gibt:

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

Meine volle CMakeLists.txt hier:

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

See [Wie kann ich einen Bibliotheksnamen .so Datei finden?] (Http://stackoverflow.com/questions/40342705/how-can-i-find-a-library-name -of-so-file/40343060 # 40343060) –

Antwort

1

Unter Linux Linker erwartet Bibliothek Dateiname mit „lib“ vorangestellt werden:

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

Wenn Ihre Bibliotheksdatei kein solches Präfix hat, kann es nicht durch den Linker mit Ebene Bibliotheksnamen gefunden werden.

Wie Gegenteil, vollständigen Bibliothek Dateiname in target_link_libraries Aufruf Angabe funktioniert immer:

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

In diesem Fall link_directories() Aufruf ist nicht erforderlich.

1

link_directories nur CMake erzählt, welche Verzeichnisse für die Bibliotheken nach innen zu schauen Sie möchten eine Verknüpfung herstellen, nicht die Bibliotheken, die Sie verknüpfen möchten. Mein Vorschlag wäre, eine Datei SimGrid.cmake Namen zu erstellen und fügen Sie folgendes:

# -*- 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 
    ) 

In Ihrem CMakeLists.txtinclude(SimGrid) fügen in die neue Datei zu ziehen

Dann in Ihrem CmakeLists.txt verwenden die neuen Variablen und target_link_libraries das ist. verwenden Sie den Linker sagen, die Funktion, die Sie, was Sie wollen Link-Bibliotheken:

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

natürlich könnte man noch hinzufügen, alles zu Ihrem einzigen CMakeLists.txt, aber die Aufteilung ist eine gute Übung, um die Dinge überschaubar zu halten.

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

Ich habe Ihre Empfehlungen zu 'CMakeLists.txt' hinzugefügt, aber ich habe den gleichen Fehler. –

+0

Vielleicht liegt es daran, dass ich '.so' Datei, nicht' .a' Datei habe? –

+0

@CinderBiscuits: Mit [target_link_libraries] (https://cmake.org/cmake/help/v3.7/command/target_link_libraries.html) mit ** relativen Pfad ** (wie 'simgrid.a') zur Bibliothek ist * undefiniertes Verhalten *. Stattdessen verwendet der ursprüngliche Kern ** den einfachen Bibliotheksnamen ** ('simgrid'), der ein * wohldefiniertes Verhalten * aufweist. Abgesehen von zusätzlichen Fehlern (Ihr 'SimGrid.cmake' vermisst' include_directories' Aufruf) hat Ihr Ansatz ein wenig Sinn. Wenn Sie ein zusätzliches Skript für die Bibliothekserkennung empfehlen, sollte das 'FindSimGrid.cmake'-Skript in' find_package (SimGrid) 'enthalten sein. – Tsyvarev

0

Meine Empfehlung ist, die libs zu finden, von denen Ihr Projekt abhängt, und es mit dem Ziel zu verknüpfen. Somit ist kein absoluter oder relativer Pfad in der cmake-Datei enthalten, sondern wird während der Ausführung von cmake erkannt.

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