2016-10-08 6 views
-1

cmakeを使うには、私のプロジェクトでCMakeを使って整理した完全な最小限のハッシングライブラリをcmphライブラリをubuntuマシンにインストールし、 main.c私は、次のコマンドを使用してgccの5.3.0を使用してこのファイルをコンパイルしようとした場合私のプロジェクトでCMakeを使ってコンパイルしたcmphライブラリをリンクするには

は:

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. 

私はプロジェクトをコンパイルしない限り、ターゲット実行可能ファイルを取得しません。ライブラリリンクに関連するコマンドを使わずにプロジェクトをコンパイルしようとすると、コンパイラは質問の冒頭で同様のリンクエラーを表示します。

Undefined reference to cmph functions even after installing cpmh library

をそして私は、これらのサイトが提供する手順を試してみました:

私は、次の質問をチェックした

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

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

感謝を事前に。

+0

'CMPH_LIBRARIES'の値は何ですか? – usr1234567

+0

@ usr1234567これは/ usr/share/libで、パターンlibcmph *に一致する.aと.soファイルがあります。* –

+0

phismはどこにも宣言されていません。あなたは 'add_executable'を逃しましたか?それはあなたがそれに物をリンクしようとする前に定義する必要があります。あなたの自動add_executableコードは奇妙に見えますが、私はそのようなことはしません。それはCMakeスタイルではありません。 – usr1234567

答えて

0

最終的に解決されました。

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が含まれていることを確認しますとusr1234567 @「add_executable」

を呼び出した後、リンク操作を追加ご清聴ありがとうございました。

+0

それはあなたのためにうれしいです。通常、私はあなたにこれを手伝ったので、私は質問に答えることができます。コードを落とすことは答えではないので、実際の解決策についても説明する必要があります。ところで、これはあまり現実的な形ではなく、それをSOに保存する価値のないような基本的な間違いです。私はこの質問を閉じるために投票する。 – usr1234567

関連する問題