Как связать скомпилированную библиотеку cmph в моем проекте, используя CMake

Чтобы использовать идеальную минимальную библиотеку хеширования cmph, в моем проекте, организованном с использованием CMake, я установил библиотеку cmph на машину с Ubuntu и протестировал ее с помощью одного файла c с именем main.c.

Если я пытаюсь скомпилировать этот файл, используя gcc 5.3.0, используя следующую команду:

gcc main.c

Я получу следующий вывод

/tmp/ccSOH5ob.o: In function `main':
testperfect.c:(.text+0x63): undefined reference to   `cmph_io_vector_adapter'
testperfect.c:(.text+0x73): undefined reference to `cmph_config_new'
testperfect.c:(.text+0x88): undefined reference to `cmph_config_set_algo'
testperfect.c:(.text+0x9b): undefined reference to `cmph_config_set_mphf_fd'
testperfect.c:(.text+0xa7): undefined reference to `cmph_new'
testperfect.c:(.text+0xb7): undefined reference to `cmph_config_destroy'
testperfect.c:(.text+0xca): undefined reference to `cmph_dump'
testperfect.c:(.text+0xd6): undefined reference to `cmph_destroy'
testperfect.c:(.text+0xe2): undefined reference to `cmph_load'
testperfect.c:(.text+0x118): undefined reference to `cmph_search'
testperfect.c:(.text+0x153): undefined reference to `cmph_destroy'
testperfect.c:(.text+0x15f): undefined reference to  `cmph_io_vector_adapter_destroy'

Но если я запускаю эту команду:

gcc main.c $(pkg-config --libs cmph) -o main

Он будет скомпилирован и работает нормально.

Теперь мне нужно добавить подобный кусок кода в моем проекте, и CMakeList.txt написан так:

set(PROJECT_EXECUTABLE ${PROJECT_NAME})

# Compiling flags.
if(CMAKE_CXX_COMPILER_ID MATCHES "GNU" OR
CMAKE_CXX_COMPILER_ID MATCHES "Clang")
set(CMAKE_CXX_FLAGS_RELEASE        "-O2")
set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O2 -g")
set(CMAKE_CXX_FLAGS_DEBUG          "-g")
set(CMAKE_CXX_FLAGS_MINSIZEREL     "-Os")
endif()
# Inject project config.
configure_file(
${PROJECT_INCLUDE_DIR}/phsim/config.hpp.in
${PROJECT_INCLUDE_DIR}/phsim/config.hpp
)

include(FindPkgConfig)
find_package(PkgConfig REQUIRED)
pkg_search_module(CMPH REQUIRED cmph)
target_link_libraries(Phsim ${CMPH_LIBRARIES})
target_include_directories(Phsim PUBLIC ${CMPH_INCLUDE_DIRS})
target_compile_options(Phsim PUBLIC ${CMPH_CFLAGS_OTHER})

# Compile executable.
file(GLOB SOURCES ${PROJECT_SRC_DIR}/*.cpp)
add_executable(${PROJECT_EXECUTABLE} ${SOURCES})

set_target_properties(${PROJECT_EXECUTABLE} PROPERTIES
VERSION ${PHSIM_VERSION_LITER}
)

И тогда я пытаюсь запустить cmake. и сделать, но только получить сообщение об ошибке:

CMake Error at src/CMakeLists.txt:20 (target_link_libraries):
Cannot specify link libraries for target "Phsim" which is not built by this
project.

Но я не получу целевой исполняемый файл, пока не скомпилирую проект. Если я попытаюсь скомпилировать свой проект без команд, связанных со связыванием библиотек, компилятор выдаст похожие ошибки ссылок, приведенные в начале моего вопроса.

Я проверил следующие вопросы:

Неопределенная ссылка на функции cmph даже после установки библиотеки cpmh

И я попробовал инструкции, предоставленные этими сайтами:

https://cmake.org/Wiki/CMake:How_To_Find_Libraries

https://cmake.org/cmake/help/v3.6/module/FindPkgConfig.html

Спасибо заранее.

-1

Решение

Наконец-то решено.

cmake_minimum_required(VERSION 3.0.2)
project(TestGamma)

set(GAMMATEST_VERSION_MAJOR 1)
set(GAMMATEST_VERSION_MINOR 0)
set(CMPH_INCLUDE_DIR /usr/local/lib)

include(FindPkgConfig)
configure_file(
"${PROJECT_SOURCE_DIR}/TestGammaConfig.h.in""${PROJECT_BINARY_DIR}/TestGammaConfig.h")

include_directories(${PROJECT_BINARY_DIR})

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

set(SOURCE_FILES main.cpp)

add_executable(testgamma ${SOURCE_FILES})
pkg_check_modules(CMPH REQUIRED cmph)
include_directories(${CMPH_INDLUDE_DIR})
link_directories(${CMPH_INCLUDE_DIR})
target_link_libraries(testgamma cmph ${CMPH_INCLUDE_DIR})

Убедитесь, что сначала включили pkgconfig и добавили операции ссылки после вызова add_executable

@ usr1234567 Спасибо за внимание.

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector