2014-06-21 7 views
4

site (하단)의 예제 코드를 컴파일하려고합니다. GLFW 3.0.4 소스 코드를 다운로드하여 사용자 정의 위치에 빌드했습니다. 기본 설정을 사용하고 GLFW는 정적 라이브러리로 작성되었습니다. 내 CMakeLists.txt은 다음과 같습니다GLFW - UBuntu에서 링커 오류 14.04 LTS

cmake_minimum_required(VERSION 2.8) 
project(glfw_test_project) 

SET(CMAKE_CXX_FLAGS "-Wall -Werror -g -std=c++11") 

find_package(OpenGL REQUIRED) 

include_directories(/home/user/MyLibs/OpenGL/glfw-3.0.4/include) 
link_directories(/home/user/MyLibs/OpenGL/glfw-3.0.4/build/src) 

add_executable(glfw_test main.cpp) 

target_link_libraries(glfw_test ${OPENGL_gl_LIBRARY}) 
target_link_libraries(glfw_test glfw3) 

내가 을 실행 내가 정보를 원하시면 다음 얻을합니다

Linking CXX executable glfw_test 
/usr/bin/ld: /home/user/MyLibs/OpenGL/glfw-3.0.4/build/src/libglfw3.a(x11_clipboard.c.o): undefined reference to symbol 'XConvertSelection' 
//usr/lib/x86_64-linux-gnu/libX11.so.6: error adding symbols: DSO missing from command line 
collect2: error: ld returned 1 exit status 
make[2]: *** [glfw_test] Error 1 
make[1]: *** [CMakeFiles/glfw_test.dir/all] Error 2 
make: *** [all] Error 2 

잘못 무엇입니까?

편집 1 동적 라이브러리로 GLFW를 빌드하면 정상적으로 작동합니다. 그럼 내 CMakeLists.txt의 마지막 라인으로 대체되어야한다 : 정적 라이브러리를 사용할 때 잘못된 무엇

target_link_libraries(glfw_test glfw) 

?

+0

가능한 중복 NetBeans] (http://stackoverflow.com/questions/23171894/cant-compile-easy-source-in-c-and-opengl-glfw-in-linux-in-netbeans) – Mehrdad

+0

해결책을 찾지 못했습니다. 내 문제에. – Irbis

+0

'-lX11'을 시도 했습니까? – Mehrdad

답변

2

GLFW를 공유 라이브러리로 다시 작성하고 예제 코드를 링크하여 문제를 해결 한 것으로 보입니다. 대신 정적 라이브러리를 연결하려고 할 때 왜 작동하지 않는지에 대한 후속 질문에 대답하려고 노력할 것입니다.

기본적으로 정적 라이브러리 libglfw3.a에 연결하려면 모든 종속 X11 라이브러리를 링크해야합니다. 링크 할 추가 라이브러리를 지정하지 않았기 때문에 정적 라이브러리를 링크하는 중 오류가 발생하며 CMake는 이러한 종속성이 무엇인지 알지 못합니다. 공유 라이브러리 libglfw.so을 연결할 때 X11 라이브러리가 공유 라이브러리에 연결되어 있기 때문에 오류가 발생하지 않으며 CMake는 자동으로 해당 라이브러리를 가져옵니다.

정적 라이브러리를 사용하려는 경우 다음과 같이 링크 할 라이브러리를 결정할 수 있습니다. 당신이 CMake 명령으로 이것을 번역하면

pkg-config --static --libs x11 xrandr xi xxf86vm gl 

, 그것은 다음과 같을 것이다 :

GLFW에서 .PC 파일에 따르면, 이러한이 무엇인지 알아 내기 위해 명령 줄이를 입력 할 수 있습니다
target_link_libraries(glfw_test glfw3 Xrandr Xrender Xi GL m dl drm Xdamage X11-xcb xcb-glx xcb-dri2 xcb-dri3 xcb-present xcb-sync xshmfence Xxf86vm Xfixes Xext X11 pthread xcb Xau Xdmcp) 

CMakeLists.txt에이 코드를 추가하면 예제 코드가 문제없이 빌드됩니다. 그런데

, 당신은 자동으로 다음과 같은 방법으로 CMake를 사용하여 X11 라이브러리를 찾을 수 있습니다

find_package(X11 REQUIRED) 
target_link_libraries(my_program ${X11_LIBRARIES}) 

그러나, X11_LIBRARIES 변수에 저장된 라이브러리 세트는 필요한 라이브러리의 하위 집합을 포함합니다 정적 GLFW 연결.

나는 CMake에서 정적/동적 링크를 올바르게 처리하는 방법을 잘 모르지만, 이것이 도움이되기를 바랍니다.

5

우분투 14.04 LTS에서 같은 문제가 발생했습니다. 먼저

: error adding symbols: DSO missing from command line 링커 명령 줄 매개 변수의 잘못된 위해을 보여줍니다. 이 post은 저를 깨닫게했습니다. 링커 호출을보고 자신의 눈으로 확인하려면 $ make VERBOSE=1으로 전화해야합니다.기억하십시오 : TARGET_LINK_LIBRARIES()이 (가) CMakeLists.txt의 마지막 명령이어야합니다.이 번호는 order explanation입니다.

두 번째 : 정적 GLFW3 라이브러리에 대해 빌드하면 모든 X11 라이브러리가 위에서 설명한 atsui처럼 링커 호출에 자동으로 추가되지 않습니다. GLFW-Documentation에는 필요에 맞게 cmake 변수를 찾을 수 있습니다 : ${GLFW_STATIC_LIBRARIES}. 그것의 사용을하고 더 자동 빌드 프로세스를 활성화 pkg-config는 X11 libs와 모든 종속성을 찾을 수 있습니다 :

CMAKE_MINIMUM_REQUIRED(VERSION 2.8) 
PROJECT(myProject) 

FIND_PACKAGE(PkgConfig REQUIRED) 
pkg_search_module(GLFW3 REQUIRED glfw3) # sets GLFW3 as prefix for glfw vars 

# now ${GLFW3_INCLUDE_DIR}, ${GLFW3_LIBRARIES} and ${GLFW3_STATIC_LIBRARIES} 
# are set 

INCLUDE_DIRECTORIES(${GLFW3_INCLUDE_DIR}) 
ADD_EXECUTABLE(myProject mySource.cpp) 

TARGET_LINK_LIBRARIES(myProject ${GLFW_STATIC_LIBRARIES}) 
# they include X11 libs 

을 지금 $ make VERBOSE=1 다시 링커 LIB 매개 변수를 확인하고이 같은 더 많은 X11 libs와 찾아야한다 : -lXrandr -lXi -lXrender -ldrm -lXdamage -lXxf86vm -lXext -lX11-lpthread.

세 번째 : 공유 라이브러리와 링크 할 때 X11 등에 대한 종속성이 동적으로 해결됩니다. 그래서 X11 lib 플래그를 링커에 명시 적으로 추가 할 필요가 없습니다. 이 경우에만 필요합니다 TARGET_LINK_LIBRARIES(myProject ${GLFW_LIBRARIES})

넷째을 : 그것이 나에게 일어난, 일부 glfwCommands이 undefined reference to 있다고 - 링커 오류. GLFW3을 /usr/local/lib에 설치했지만 링커는 으로 설정된 LD_LIBRARY_PATH 환경 변수 만 받았습니다. 매개 변수 -L/usr/local/lib을 추가하면 참조 문제가 해결되었습니다. 나중에이를 피하기 위해 LD_LIBRARY_PATH=/usr/lib32;/usr/local/lib;을 설정했습니다.

힌트 :는, 값이 GLFW의 cmake 변수에 무엇인지 확인 빌드하는 동안 그들을 인쇄 :

FOREACH(item ${GLFW3_STATIC_LIBRARIES}) 
    MESSAGE(STATUS " using lib: " ${item}) 
ENDFOREACH() 
리눅스에서 C로 쉽게 소스를 컴파일 ++와 OpenGL (GLFW) 할 수 없습니다 [의
관련 문제