Skip to content

CMake:Troubleshooting

CMake사용시 발생할 수 있는 문제점에 대한 해결 방법을 정리한다.

Objective-C compile

Objective-C#CMake compile 항목 참조.

CMake function target

CMake 스크립트를 타겟(Target)으로 하고 싶을 경우 아래와 같이 적용한다.

add_custom_target(target_name
    COMMAND ${CMAKE_COMMAND} -P path_to_script
)

list argument

함수 파라미터로 리스트가 전달되지 않을 경우, 쿼우팅 (Quoting)을 했는지 확인하면 된다.

test_function (${LIBRARY_NAMES_LIST}) # ERROR.
test_function ("${LIBRARY_NAMES_LIST}") # OK!

Not found stdio.h

어느 순간부터 갑자기 make명령에서 stdio.h를 찾을 수 없는 등 이상현상이 발생할 수 있다. 이 경우, 변수의 중복여부 등을 확인해 보자. include 등을 사용하면서 문제가 발생되었을 확률이 높다.

list does not recognize sub-command FILTER

CMake 버전이 3.6보다 낮을 경우 아래와 같은 에러가 발생될 수 있다.

list does not recognize sub-command FILTER

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실행시 환경 변수를 전달하는 방법은 아래와 같다.

set(ENV{LD_LIBRARY_PATH} my_path)
execute_process(COMMAND my_process)

접근 가능한 전체 변수 목록을 출력하는 방법은 아래와 같다.

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에서 FindPythonLibs를 사용하여 Python을 찾을 수 없을 경우 아래와 같이 메시지가 출력된다.

Could NOT find PythonLibs (missing: PYTHON_LIBRARIES PYTHON_INCLUDE_DIRS)

이 경우 cmake 옵션에 PYTHON_LIBRARYPYTHON_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로 적는 방법은 아래와 같다.

set (CMAKE_INSTALL_NAME_DIR "${CMAKE_INSTALL_PREFIX}/lib")

See also

References


  1. cmake_install.cmake스크립트 내부에서 install_name_tool -id liba.3.0.dylib /Users/user/Downloads/liba.3.0.dylib을 사용하여 install_name경로를 덮어쓴다.