소스 디렉터리의 정적 라이브러리에 연결하도록 CMake에 어떻게 지시합니까?


96

주로 CMake에 대한 경험을 얻기 위해 CMake로 변환하려는 Makefile이있는 작은 프로젝트가 있습니다. 이 예제의 목적을 위해 프로젝트에는 소스 파일 (C ++, 언어가 특별히 관련이 없다고 생각하지만)과 내가 다른 곳에서 복사 한 정적 라이브러리 파일이 포함되어 있습니다. 논쟁을 위해 라이브러리에 대한 소스 코드를 사용할 수 없다고 가정합니다. .a 파일과 해당 헤더 만 있습니다.

내 수제 Makefile에는 다음 빌드 규칙이 포함되어 있습니다.

main: main.o libbingitup.a
    g++ -o main main.o libbingitup.a

잘 작동합니다. 이를 재현하도록 CMake에 어떻게 지시합니까? 물론 말 그대로이 정확한 메이크 파일이 아니라 동등한 연결 명령을 포함하는 것입니다. 나는 명백하지만 순진한 방법을 시도했습니다.

add_executable(main main.cpp libbingitup.a)

또는

add_executable(main main.cpp)
target_link_libraries(main libbingitup.a)

link_directories(.)또는 add_library(bingitup STATIC IMPORTED)등등 과 함께 다양한 것뿐만 아니라 지금까지 성공적인 연결을 초래하는 것은 없습니다. 나는 무엇을해야합니까?


버전 세부 정보 : GCC 4.6.3을 사용하는 Linux (Kubuntu 12.04)의 CMake 2.8.7

답변:


121

CMake는 링크 라이브러리에 대한 전체 경로를 전달하는 것을 선호하므로 libbingitup.a가에 있다고 가정 ${CMAKE_SOURCE_DIR}하면 다음 작업이 성공해야합니다.

add_executable(main main.cpp)
target_link_libraries(main ${CMAKE_SOURCE_DIR}/libbingitup.a)

2
훌륭합니다. 감사합니다! ... 명시 적으로 여기에 전체 경로에 넣어 가지고 조금 hackish 보인다,하지만 난 그의를 바로 CMake 방법을 생각
데이비드 Z에게

4
나는 여기에서 과잉처럼 보이지만 동일한 lib의 여러 버전이 설치된 경우 전체 경로를 명시 적으로 지정하면 배당금을 지불합니다.
Fraser

1
평소처럼 놀랍습니다! 제 경우에는 정적 라이브러리에 의존하는 다른 빌드 된 동적 라이브러리에 따라 라이브러리 문제를 해결했습니다. 종속 라이브러리도이 정적 라이브러리에 연결하려고했습니다.
Antonio

1
메인은 include 디렉토리에 대해 어떻게 압니까?
ManuelSchneid3r

3
target_include_directories또는 include_directories(전자가 더 구체적이므로 선호되는 방법) 을 사용해야 합니다.
Fraser

32

전체 경로를 포함하지 않으려면 다음을 수행 할 수 있습니다.

add_executable(main main.cpp)
target_link_libraries(main bingitup)

bingitup CMake 프로젝트에서 정적 라이브러리를 만드는 경우 대상에 부여 할 이름과 동일합니다.

add_library(bingitup STATIC bingitup.cpp)

CMake는 Linux에서 lib전면과 .a끝에 자동으로 추가합니다..lib Windows의 경우 끝에 .

라이브러리가 외부인 경우 다음을 사용하여 라이브러리에 경로를 추가 할 수 있습니다.

link_directories(/path/to/libraries/)

1
그리고 같은 이름을 가진 .a 및 .so 파일이있는 경우이 경우 .a 또는 .so에 대해 링크하려는 방식을 지정 하시겠습니까?
George

1
@George : 당신은 할 수 없습니다. 두 유형이 모두있는 경우 링크 할 파일의 전체 이름을 포함합니다.
Cris Luengo

21

도움이 되었네요 ...

http://www.cmake.org/pipermail/cmake/2011-June/045222.html

그들의 예에서 :

ADD_LIBRARY(boost_unit_test_framework STATIC IMPORTED)
SET_TARGET_PROPERTIES(boost_unit_test_framework PROPERTIES IMPORTED_LOCATION /usr/lib/libboost_unit_test_framework.a)
TARGET_LINK_LIBRARIES(mytarget A boost_unit_test_framework C)

3
INCLUDE_DIRECTORIES는 어떻습니까?
kyb

1
이것은 라이브러리가 cmake 빌드의 일부인 경우에만 작동하지만 외부 빌드는 작동하지 않습니다.
eigenfield

질문은 "이 프로젝트에는 소스 파일 (C ++, 언어가 특별히 관련성이 없다고 생각하지만)과 내가 다른 곳에서 복사 한 정적 라이브러리 파일이 포함되어 있습니다."라고 말합니다.
stu
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.