2016-04-19 4 views
0

Ich habe zwei C++ Projekte A und B Projekt B ist abhängig von Projekt A. Projekt A hat diese Struktur aufgeteilt in einige Unterverzeichnisse:A probem mit der Verwendung von statischen Bibliotheken in Cmake Projekt

Project A 
|-\inc 
| |-a1.h 
| |-a2.h 
|-\src 
    |-CMakeLists.txt 
    |-\subdir_A1 
    | |-CMakeLists.txt 
    | |-a1.cpp 
    | 
    |-\subdir_A2 
     |-CMakeLists.txt 
     |-a2.cpp 

Project B 
|-\lib 
    |-a1.h 
    |-a2.h 
    |-lib_ProjectA.a 
|-\src 
    |-CMakeLists.txt 
    |-b.cpp 

Das Problem ist, dass Projekt B kann die A-Definitionen des Projekts nicht auflösen. Obwohl ich target_link_libraries zu CMakeLists.txt in Project B hinzugefügt haben, habe ich einen Fehler wie folgt aus:

undefined reference to `project_a :: a1 :: func1()“

UPD1

Ich konnte Projekt B kompilieren, indem ich alle Bibliotheken aus Unterverzeichnissen (liba1.a, liba2.a) kopierte und sie mit dem Projekt verknüpfte.Ich frage mich, ob es möglich ist, Projekt A zu optimieren, so dass ich nur eins tun kann Datei lib_ProjectA.a

UPD2

Code:

Projekt A

add_library (adapter 
    adapter.cpp 
) 

target_link_libraries (adapter PUBLIC 
    net # From project's A subdirectory 
    utils # From project's A subdirectory 
) 

Projekt B

add_library (anthill 
    functional_block.cpp) 

target_link_libraries(anthill 
    ${PROJECT_SOURCE_DIR}/lib/libjsoncpp.a 
    ${PROJECT_SOURCE_DIR}/lib/libadapter.a 
    ${PROJECT_SOURCE_DIR}/lib/libnet.a  # Can't compile without it 
    ${PROJECT_SOURCE_DIR}/lib/libutils.a # Can't compile without it 
) 
+0

Vielleicht ist es ausreichend, 'link_directories ($ {CMAKE_SOURCE_DIR}/lib)' in Ihrer 'CMakeLists.txt' im Projekt' B' zu setzen. Ich bin mir nicht sicher, versuche es und füge es als Antwort hinzu, wenn es sich löst. – skypjack

+0

Können Sie uns bitte die relevanten Teile Ihrer CMake-Dateien zeigen? – MikeMB

+0

@MikeMB Eigentlich ist das Projekt viel größer und hat viele Unterverzeichnisse mit anderen Namen. Ich fürchte, ich mache es nur noch verwirrender. Jetzt besteht das Problem darin, Projekt B zu kompilieren, ohne liba1.a und liba2.a zu kopieren. Ist es möglich? – flipback

Antwort

0

Die beste Lösung OBJECT Option zu verwenden:

add_library(myObjects OBJECT a.c b.c)