[CMake] link problem with a name changed target

Yuri V. Timenkov ytimenkov at parallels.com
Thu Aug 21 09:48:02 EDT 2008


On Thursday 21 August 2008 17:27:36 Ingrid Kemgoum wrote:
> HI,
> i'm building a project with 3 targets in Linux. each target has a different
> name when in debug.
>
> the executable i want to link to the 2 libraries fail to find thoz libs
> when i'm in debug (not the case in release, everything's good).
>
> here is the CMakeLists of the executable
>
Very strange file, but...
>
> cmake_minimum_required(VERSION 2.6)
> include_directories (${ORIGIN}/tst_xsystem/../../../import/xdefaut/inc
> ${ORIGIN}/tst_xsystem/../../../inc
> ${ORIGIN}/tst_xsystem/../../../imports/xdefaut/inc )
> set(sources ${ORIGIN}/tst_xsystem/../../../src/tst_xsystem.c
> ${ORIGIN}/tst_xsystem/../../../imports/xdefaut/inc/x_defaut.h)
BTW: CMake defines ${CMAKE_SOURCE_DIR} and ${CMAKE_CURRENT_SOURCE_DIR} 
variables. I suppose they can be used instead of origin. The whole code will 
look cleaner...

> if (CMAKE_HOST_WIN32)
>   set (sources ${sources} ${ORIGIN}/tst_xsystem/tst_xsystem.rc)
> endif(CMAKE_HOST_WIN32)
> if (CMAKE_HOST_UNIX)
>   set (sources ${sources} ${DEST}/tst_xsystem/tst_xsystem.c)
> endif(CMAKE_HOST_UNIX)
> add_executable(tst_xsystem ${sources})
> add_dependencies(tst_xsystem  libxsystem libxsystem_so)
I'm not sure if this works for not cmake targets.
>
>
> if (${CONFIG} MATCHES "DEBUG")
>  target_link_libraries(tst_xsystem libxsystemd_so libxsystemd pthread rt dl
> nsl) ###########"
> else(${CONFIG} MATCHES "DEBUG")
>  target_link_libraries(tst_xsystem libxsystem_so libxsystem pthread rt dl
> nsl)
> endif(${CONFIG} MATCHES "DEBUG")
Why not use following instead:
set(libxsystm_LIBS debug libxsystemd optimized libxsystem)
set(libxsystem_so_LIBS debug libxsystemd_so optimized libxsystem_so)
target_link_libraries(tst_xsystem libxsystem_so
	${libxsystm_LIBS}
	${libxsystem_so_LIBS}
	pthread rt dl)

Using ${CONFIG} is not portable, it will not work in generators, which support 
multiple configurations.

> set_target_properties(tst_xsystem PROPERTIES
>  PREFIX ""
>  DEBUG_OUTPUT_NAME "tst_xsystemd"
>  LINKER_LANGUAGE "CXX"
>  LINK_FLAGS_RELEASE ${linkexecutablerel}
> )
Why not use DEBUG_POSTFIX "d"?

>
>
> the problem is in the red line (marqued ########).
> names are differents and the error is
>
> Linking CXX executable
> /home/ikemgoum/workspace/reference/xsystem/code/os/linux_redhatEL4_0_i386__
>gcc3_4/bin/tst_xsystemd /usr/bin/ld: can not find -llibxsystemd
If libxsystemd is a target generated by cmake in the same project, you don't 
need to bother with release/debug switches at all (I suppose).
Next, your library should be named liblibxsystemd.so if you use 
DEBUG_OUTPUT_NAME you may break CMake rules which generate proper library 
name.
>
> am i missing something?
Too many places where the problem could be. But looking at your code, I can 
say that you try to use CMake in wrong way. While used properly, cmake makes 
many things much simpler.
> thanks for help



More information about the CMake mailing list