CMake:Troubleshooting
CMake사용시 발생할 수 있는 문제점에 대한 해결 방법을 정리한다.
Objective-C compile
Objective-C#CMake compile 항목 참조.
CMake function target
CMake 스크립트를 타겟(Target)으로 하고 싶을 경우 아래와 같이 적용한다.
list argument
함수 파라미터로 리스트가 전달되지 않을 경우, 쿼우팅 (Quoting)을 했는지 확인하면 된다.
Not found stdio.h
어느 순간부터 갑자기 make명령에서 stdio.h를 찾을 수 없는 등 이상현상이 발생할 수 있다. 이 경우, 변수의 중복여부 등을 확인해 보자. include
등을 사용하면서 문제가 발생되었을 확률이 높다.
list does not recognize sub-command FILTER
CMake 버전이 3.6보다 낮을 경우 아래와 같은 에러가 발생될 수 있다.
list
명령에 FILTER
명령이 없어서 그렇다. 아래와 같이 함수를 작성하여 대응할 수 있다.
function (__remove_windows_files __result)
set (${__result})
foreach (__source_cursor ${ARGN})
if (NOT "${__source_cursor}" MATCHES "windows[^/]*$")
list (APPEND ${__result} "${__source_cursor}")
endif ()
endforeach ()
set (${__result} ${${__result}} PARENT_SCOPE)
endfunction ()
## ...
file(GLOB LIBFLAC_SOURCES src/libFLAC/*.c)
if (CMAKE_VERSION VERSION_LESS "3.6")
__remove_windows_files (LIBFLAC_SOURCES_TEMP ${LIBFLAC_SOURCES})
set (LIBFLAC_SOURCES ${LIBFLAC_SOURCES_TEMP})
unset (LIBFLAC_SOURCES_TEMP)
else ()
list(FILTER LIBFLAC_SOURCES EXCLUDE REGEX "windows[^/]*$")
endif ()
Environment variable to execute_process
execute_process
실행시 환경 변수를 전달하는 방법은 아래와 같다.
Print out all accessible variables
접근 가능한 전체 변수 목록을 출력하는 방법은 아래와 같다.
get_cmake_property(_variableNames VARIABLES)
foreach (_variableName ${_variableNames})
message(STATUS "${_variableName}=${${_variableName}}")
endforeach()
find_path variable not working
Ubuntu 14.04에서 find_library
, find_path
와 같은 함수를 연속으로 사용할 때, 첫 번째 인자(OUTPUT VARIABLE)가 동일하면 정상적으로 작동하지 않을 수 있다. 따라서 동일한 인자 이름을 사용해선 안된다.
CMake: Could NOT find PythonLibs
- Cmake is not able to find Python-libraries
- [추천] Could NOT find PythonLibs (missing: PYTHON_INCLUDE_DIRS)
CMake에서 FindPythonLibs
를 사용하여 Python을 찾을 수 없을 경우 아래와 같이 메시지가 출력된다.
이 경우 cmake 옵션에 PYTHON_LIBRARY
와 PYTHON_INCLUDE_DIR
을 추가하면 된다.
$ cmake -DPYTHON_LIBRARY=/home/username/local/lib/libpython2.7.a -DPYTHON_INCLUDE_DIR=/home/username/local/include/python2.7
install_name absolute path
라이브러리 연결이 안될 경우, otool -L liba.dylib
와 같이 rpath 등을 확인해 보면 절대경로로 라이브러리가 적용되어 있지 않을 수 있다. 이 문제는 MaxOSX에서 cmake단계 중 cmake_install.cmake
파일을 만들어 내는데, install_name_tool을 사용하여 경로를 지워버리기 때문이다. 1
절대경로를 install_name로 적는 방법은 아래와 같다.
See also
References
-
cmake_install.cmake
스크립트 내부에서install_name_tool -id liba.3.0.dylib /Users/user/Downloads/liba.3.0.dylib
을 사용하여 install_name경로를 덮어쓴다. ↩