cmake target_link_libraries () не может найти переименованную цель lib с помощью set_target_properties (archive_output_name) - PullRequest
1 голос
/ 01 июля 2019

RT ~ пс: cmake version 3.9.2

Моя кодовая база точно такая же.

suzanwen@n224-004-133:~/repos/C++/ttt:)$ tree -L 2
.
├── build
│   ├── bin
│   ├── CMakeCache.txt
│   ├── CMakeFiles
│   ├── cmake_install.cmake
│   ├── lib
│   ├── Makefile
│   ├── test
│   └── thirdparty
├── build.sh
├── CMakeLists.txt
├── Makefile
├── test
│   ├── CMakeLists.txt
│   └── main.cc
└── thirdparty
    ├── CMakeLists.txt
    ├── gflags
    └── hellolib

10 directories, 9 files

моя третья сторона / hellolib / CMakeLists.txt равна

PROJECT(hello)

SET(LIBHELLO_SRC hello.cc)
MESSAGE(STATUS "LIBRARY PATH=" ${LIBRARY_OUTPUT_PATH})

ADD_LIBRARY(hello_static STATIC ${LIBHELLO_SRC})
SET_TARGET_PROPERTIES(hello_static PROPERTIES ARCHIVE_OUTPUT_NAME "hello")

мой тест / CMakeLists.txt равен

INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/thirdparty/hellolib
                    ${PROJECT_SOURCE_DIR}/thirdparty/gflags/include)

IF(LIBRARY_OUTPUT_PATH)
  LINK_DIRECTORIES(${LIBRARY_OUTPUT_PATH})
ENDIF(LIBRARY_OUTPUT_PATH)

ADD_EXECUTABLE(main main.cc)

TARGET_LINK_LIBRARIES(main hello)
# TARGET_LINK_LIBRARIES(main hello_static)

когда я строю свой проект верхнего уровня, возникает ошибка, подобная этой.

/usr/bin/c++    -rdynamic CMakeFiles/main.dir/main.cc.o  -o ../bin/main  -L/home/suzanwen/repos/C++/ttt/build/lib -Wl,-rpath,/home/suzanwen/repos/C++/ttt/build/lib -lhello
/usr/bin/ld: cannot find -lhello

Но когда я комментирую строки # SET_TARGET_PROPERTIES(hello_static PROPERTIES ARCHIVE_OUTPUT_NAME "hello") и TARGET_LINK_LIBRARIES с помощью hello_static, все идет хорошо.

Кажется, TARGET_LINK_LIBRARIES не может найти переименованную цель lib. Кто-нибудь может это объяснить? заранее спасибо.

1 Ответ

2 голосов
/ 01 июля 2019

Похоже, TARGET_LINK_LIBRARIES не может найти переименованную цель lib.

Установка свойства ARCHIVE_OUTPUT_NAME переименовывает не цель target , а вывод file . Так что связь с target все еще работает:

TARGET_LINK_LIBRARIES(main hello_static)

Нельзя переименовать цель после ее создания, но возможно создать ALIAS для цели:

ADD_LIBRARY(hello ALIAS hello_static)

После этого можно связать с псевдонимом:

TARGET_LINK_LIBRARIES(main hello)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...