2012-10-26 3 views
2

위의 코드가 들어있는 제공된 CMakeLists.txt 파일을 사용하고 있습니다. 내가 뭘 하려는지/MT 플래그를 사용하여 라이브러리를 컴파일하는 것입니다. 아무도 그렇게하는 법을 알고 있습니까? 사전에/MT 플래그가있는 MSVC로 jrtplib 컴파일

감사합니다, 코드 여기

:

cmake_minimum_required(VERSION 2.6) 

project(jrtplib) 
set(VERSION 3.9.1) 

SET(CMAKE_C_FLAGS "/nologo /W3 /GX /Gy /YX") 
     SET(CMAKE_C_FLAGS_DEBUG "/MTd /Z7 /Od") 
     SET(CMAKE_C_FLAGS_RELEASE "/MT /O2") 
     SET(CMAKE_C_FLAGS_MINSIZEREL "/MT /O2") 
     SET(CMAKE_C_FLAGS_RELWITHDEBINFO "/MTd /Z7 /Od") 

set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${PROJECT_SOURCE_DIR}/cmake") 

set (_DEFAULT_LIBRARY_INSTALL_DIR lib) 
if (EXISTS "${CMAKE_INSTALL_PREFIX}/lib32/" AND CMAKE_SIZEOF_VOID_P EQUAL 4) 
    set (_DEFAULT_LIBRARY_INSTALL_DIR lib32) 
elseif (EXISTS "${CMAKE_INSTALL_PREFIX}/lib64/" AND CMAKE_SIZEOF_VOID_P EQUAL 8) 
    set (_DEFAULT_LIBRARY_INSTALL_DIR lib64) 
endif() 

set(LIBRARY_INSTALL_DIR "${_DEFAULT_LIBRARY_INSTALL_DIR}" CACHE PATH "Library installation directory") 
if(NOT IS_ABSOLUTE "${LIBRARY_INSTALL_DIR}") 
    set(LIBRARY_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/${LIBRARY_INSTALL_DIR}") 
endif() 

include(CheckCXXCompilerFlag) 
include(CheckIncludeFile) 
include(CheckIncludeFileCXX) 
include(CheckCXXSourceCompiles) 
include(TestBigEndian) 
include(${PROJECT_SOURCE_DIR}/cmake/Macros.cmake) 

find_package(JThread) 

set(JRTPLIB_LINK_LIBS "") 
set(JRTPLIB_INTERNAL_INCLUDES "") 
set(JRTPLIB_EXTERNAL_INCLUDES "") 

add_additional_stuff(JRTPLIB_EXTERNAL_INCLUDES JRTPLIB_LINK_LIBS) 

jrtplib_support_option("Support SDES PRIV items" JRTPLIB_SUPPORT_SDESPRIV RTP_SUPPORT_SDESPRIV ON "// No support for SDES PRIV items") 
jrtplib_support_option("Support the probation mechanism for a new source" JRTPLIB_SUPPORT_PROBATION RTP_SUPPORT_PROBATION ON "// Do not wait for a number of consecutive packets to validate source") 
jrtplib_support_option("Support sending RTCP APP packets" JRTPLIB_SUPPORT_SENDAPP RTP_SUPPORT_SENDAPP ON "// No direct support for sending RTCP APP packets") 
jrtplib_support_option("Support sending unknown RTCP packets" JRTPLIB_SUPPORT_RTCPUNKNOWN RTP_SUPPORT_RTCPUNKNOWN OFF "// No support for sending unknown RTCP packets") 
jrtplib_support_option("Support memory management mechanism" JRTPLIB_SUPPORT_MEMORYMGMT RTP_SUPPORT_MEMORYMANAGEMENT ON "// No memory management support") 

jrtplib_include_test(sys/filio.h RTP_HAVE_SYS_FILIO "// Don't have <sys/filio.h>") 
jrtplib_include_test(sys/sockio.h RTP_HAVE_SYS_SOCKIO "// Don't have <sys/sockio.h>") 
jrtplib_include_test(ifaddrs.h RTP_SUPPORT_IFADDRS "// No ifaddrs support") 

if (JTHREAD_FOUND) 
    set(V "ON") 
else (JTHREAD_FOUND) 
    set(V "OFF") 
endif (JTHREAD_FOUND) 

option(JTHREAD_ENABLED "Thread support" ${V}) 
if (JTHREAD_ENABLED) 
    set (RTP_SUPPORT_THREAD "#define RTP_SUPPORT_THREAD") 
    if (JTHREAD_FOUND) 
     save_paths(JRTPLIB_EXTERNAL_INCLUDES "${JTHREAD_INCLUDE_DIRS}") 
     save_paths(JRTPLIB_LINK_LIBS "${JTHREAD_LIBRARIES}") 
    endif(JTHREAD_FOUND) 
else (JTHREAD_ENABLED) 
    set (RTP_SUPPORT_THREAD "// No support for JThread was enabled") 
endif (JTHREAD_ENABLED) 

if (CMAKE_CROSSCOMPILING) 
    option (JRTPLIB_USE_BIGENDIAN "Target platform is big endian" ON) 
    if (JRTPLIB_USE_BIGENDIAN) 
     set(RTP_ENDIAN "#define RTP_BIG_ENDIAN") 
    else (JRTPLIB_USE_BIGENDIAN) 
     set(RTP_ENDIAN "// Little endian system") 
    endif (JRTPLIB_USE_BIGENDIAN) 
else (CMAKE_CROSSCOMPILING) 
    test_big_endian(JRTPLIB_BIGENDIAN) 
    if (JRTPLIB_BIGENDIAN) 
     set(RTP_ENDIAN "#define RTP_BIG_ENDIAN") 
    else (JRTPLIB_BIGENDIAN) 
     set(RTP_ENDIAN "// Little endian system") 
    endif (JRTPLIB_BIGENDIAN) 
endif (CMAKE_CROSSCOMPILING) 

jrtplib_test_feature(socklentest RTP_SOCKLENTYPE_UINT TRUE "// socklen_t is 'int'") 
jrtplib_test_feature(ipv4mcasttest RTP_SUPPORT_IPV4MULTICAST FALSE "// No IPv4 multicasting support") 
jrtplib_test_feature(salentest RTP_HAVE_SOCKADDR_LEN FALSE "// No sa_len member in struct sockaddr") 
jrtplib_test_feature(getloginrtest RTP_SUPPORT_GETLOGINR FALSE "// Not using getlogin_r") 
jrtplib_test_feature(ipv6test RTP_SUPPORT_IPV6 FALSE "// No IPv6 support") 
jrtplib_test_feature(ipv6mcasttest RTP_SUPPORT_IPV6MULTICAST FALSE "// No IPv6 multicasting support") 

check_cxx_source_compiles("#include <stdint.h>\n#include <sys/types.h>\nint main(void) { size_t a = 0 ; size_t b = a; uint32_t x = 0; uint32_t y = x; return 0; }" JRTPLIB_STDINT) 
if (JRTPLIB_STDINT) 
    set(RTP_INTTYPE_HEADERS "#include <stdint.h>\n#include <sys/types.h>") 
else (JRTPLIB_STDINT) 
    check_cxx_source_compiles("#include <inttypes.h>\n#include <sys/types.h>\nint main(void) { uint32_t x = 0; uint32_t y = x; return 0; }" JRTPLIB_INTTYPES) 
    if (JRTPLIB_INTTYPES) 
     set(RTP_INTTYPE_HEADERS "#include <inttypes.h>\n#include <sys/types.h>\n") 
    else (JRTPLIB_INTTYPES) 
     if (NOT UNIX AND WIN32) 
      set(RTP_INTTYPE_HEADERS "#include \"rtptypes_win.h\"") 
     else (NOT UNIX AND WIN32) 
      set(RTP_INTTYPE_HEADERS "#error Could not find header files that define types like 'uint32_t'. Please edit the file ${PROJECT_BINARY_DIR}/src/rtptypes_unix.h and make sure that the following types are defined: int8_t, uint8_t, int16_t, uint16_t, int32_t, uint32_t, int64_t, uint64_t") 
      message("\n\nError: Could not find header files that define types like 'uint32_t'.\nPlease edit the file ${PROJECT_BINARY_DIR}/src/rtptypes_unix.h\nand make sure that the following types are defined: \nint8_t, uint8_t, int16_t, uint16_t, int32_t, uint32_t, int64_t, uint64_t\n\n") 
     endif (NOT UNIX AND WIN32) 
    endif (JRTPLIB_INTTYPES) 
endif (JRTPLIB_STDINT) 

if (NOT UNIX AND WIN32) 
    set(RTP_WINSOCK_HEADERS "#if defined(WIN32) || defined(_WIN32_WCE)\n #include <winsock2.h> \n #include <ws2tcpip.h>\n#ifndef _WIN32_WCE\n #include <sys/types.h>\n#endif // _WIN32_WCE\n#endif // WIN32 || _WIN32_WCE\n") 
endif (NOT UNIX AND WIN32) 

if (NOT UNIX) 
    set(JRTPLIB_COMPILE_STATIC ON CACHE BOOL "Flag indicating if a static library should be built, or a dynamic one") 
    list(APPEND JRTPLIB_LINK_LIBS "ws2_32") 
endif (NOT UNIX) 

if (UNIX OR JRTPLIB_COMPILE_STATIC) 
    set(JRTPLIB_IMPORT "") 
    set(JRTPLIB_EXPORT "") 
else (UNIX OR JRTPLIB_COMPILE_STATIC) 
    set(JRTPLIB_IMPORT "__declspec(dllimport)") 
    set(JRTPLIB_EXPORT "__declspec(dllexport)") 
endif (UNIX OR JRTPLIB_COMPILE_STATIC) 

configure_file("${PROJECT_SOURCE_DIR}/src/rtptypes.h.in" "${PROJECT_BINARY_DIR}/src/rtptypes.h") 
configure_file("${PROJECT_SOURCE_DIR}/src/rtpconfig.h.in" "${PROJECT_BINARY_DIR}/src/rtpconfig.h") 

save_paths(JRTPLIB_INTERNAL_INCLUDES "${PROJECT_SOURCE_DIR}/src" "${PROJECT_BINARY_DIR}/src") 

add_subdirectory(src) 
add_subdirectory(examples) 

if (UNIX) 
    get_target_property(JRTPLIB_LOCAL_LIBRARY_NAME jrtplib-shared LOCATION) 
    get_filename_component(JRTPLIB_LIBNAME "${JRTPLIB_LOCAL_LIBRARY_NAME}" NAME) 
    set(JRTPLIB_LIBS "${LIBRARY_INSTALL_DIR}/${JRTPLIB_LIBNAME}") 
else (UNIX) 
    if (JRTPLIB_COMPILE_STATIC) 
     get_target_property(JRTPLIB_LOCAL_LIBRARY_NAME jrtplib-static RELEASE_LOCATION) 
     get_filename_component(JRTPLIB_LIBNAME_RELEASE "${JRTPLIB_LOCAL_LIBRARY_NAME}" NAME_WE) 
     get_target_property(JRTPLIB_LOCAL_LIBRARY_NAME jrtplib-static DEBUG_LOCATION) 
     get_filename_component(JRTPLIB_LIBNAME_DEBUG "${JRTPLIB_LOCAL_LIBRARY_NAME}" NAME_WE) 
    else (JRTPLIB_COMPILE_STATIC) 
     get_target_property(JRTPLIB_LOCAL_LIBRARY_NAME jrtplib-shared RELEASE_LOCATION) 
     get_filename_component(JRTPLIB_LIBNAME_RELEASE "${JRTPLIB_LOCAL_LIBRARY_NAME}" NAME_WE) 
     get_target_property(JRTPLIB_LOCAL_LIBRARY_NAME jrtplib-shared DEBUG_LOCATION) 
     get_filename_component(JRTPLIB_LIBNAME_DEBUG "${JRTPLIB_LOCAL_LIBRARY_NAME}" NAME_WE) 
    endif (JRTPLIB_COMPILE_STATIC) 
    set(JRTPLIB_LIBS optimized "${LIBRARY_INSTALL_DIR}/${JRTPLIB_LIBNAME_RELEASE}.lib" 
       debug "${LIBRARY_INSTALL_DIR}/${JRTPLIB_LIBNAME_DEBUG}.lib") 
endif (UNIX) 

set(JRTPLIB_INCDIRS ${JRTPLIB_EXTERNAL_INCLUDES} ${CMAKE_INSTALL_PREFIX}/include) 
set(JRTPLIB_LIBS ${JRTPLIB_LIBS} ${JRTPLIB_LINK_LIBS}) 
remove_empty(JRTPLIB_INCDIRS) 
list(REMOVE_DUPLICATES JRTPLIB_INCDIRS) 
remove_empty(JRTPLIB_LIBS) 

foreach(ARG ${JRTPLIB_LIBS}) 
    set(JRTPLIB_LIBS_CMAKECONFIG "${JRTPLIB_LIBS_CMAKECONFIG} \"${ARG}\"") 
endforeach() 
foreach(ARG ${JRTPLIB_INCDIRS}) 
    set(JRTPLIB_INCDIRS_CMAKECONFIG "${JRTPLIB_INCDIRS_CMAKECONFIG} \"${ARG}\"") 
endforeach() 

configure_file("${PROJECT_SOURCE_DIR}/cmake/JRTPLIBConfig.cmake.in" "${PROJECT_BINARY_DIR}/cmake/JRTPLIBConfig.cmake") 
install(FILES "${PROJECT_BINARY_DIR}/cmake/JRTPLIBConfig.cmake" DESTINATION ${LIBRARY_INSTALL_DIR}/cmake/JRTPLIB) 

if (UNIX) 
    foreach(ARG ${JRTPLIB_LIBS}) 
     set(JRTPLIB_LIBS_PKGCONFIG "${JRTPLIB_LIBS_PKGCONFIG} ${ARG}") 
    endforeach() 
    foreach(ARG ${JRTPLIB_INCDIRS}) 
     set(JRTPLIB_INCDIRS_PKGCONFIG "${JRTPLIB_INCDIRS_PKGCONFIG} -I${ARG}") 
    endforeach() 

    configure_file(${PROJECT_SOURCE_DIR}/pkgconfig/jrtplib.pc.in ${PROJECT_BINARY_DIR}/pkgconfig/jrtplib.pc) 
    install(FILES ${PROJECT_BINARY_DIR}/pkgconfig/jrtplib.pc DESTINATION ${LIBRARY_INSTALL_DIR}/pkgconfig) 
endif (UNIX) 
+0

여러분이 cmake 스크립트를 해킹하는 법을 모르면 신경 쓸 필요가 없습니다. 이 파일을 실행하여 프로젝트 파일을 생성하고 Visual Studio에서 열고 Project + Properties를 사용하여 설정을 변경하십시오. –

+0

그게 바로 내가 배우려고하는 것입니다 : cmake 스크립트를 해킹하는 법. 요점은 cmake 스크립트를 만드는 .sln과 cxproj 파일이 CMake 또는 특정 파일에 해당하며 구성 등록 정보에 General, Debugging, VC++ Directories, Build Events 및 Custom Build Tool과 같은 필드를 제공한다는 것입니다. ... –

답변

3

CMAKE_C_FLAGS과 친구들에게 플래그를 추가하면 컴파일러 특정 플래그를 전달하는 적절한 방법이지만, CMAKE_C_ *이 변수는 컴파일에 영향을 미칠 C 파일.

프로젝트에 C++ 파일이있는 경우 CMAKE_CXX_FLAGS 및 친구도 설정해야합니다.

또한 cmake-gui 또는 ccmake에서 CMakeLists 파일을 수정하지 않고도이 작업을 수행 할 수 있습니다. 한 번 구성한 후 cmake-gui 또는 ccmake에서 이러한 변수의 기본값을 볼 수 있습니다. 그런 다음 일부 변수를 앱에서 직접 변경하고 다시 구성한 다음 voila : 코드를 수정하지 않고 빌드 트리의 플래그를 설정했습니다.

항상 플래그를 원한다면 코드를 수정하는 것이 올바른 방법입니다. 그러나 빌드를 끝내기 만하면 코드를 건드리지 않고 플래그를 설정할 수 있습니다.

관련 문제