Geom
Geom

Reputation: 857

Compile order with TARGET_LINK_LIBRARIES in three CMakeLists.txt

I have a problem with CMake: A static library and an executable are made but the build process is out of order. Thus, the library does not exist when the executable tries to link. I have read similar questions but did not find a solution. My project uses one root-CMakelists.txt that includes the other two:

Root: dev/CMakeLists.txt:

# Library project
include(${CMAKE_CURRENT_SOURCE_DIR}/src_lib/CMakeLists.txt)

# Client project
include(${CMAKE_CURRENT_SOURCE_DIR}/src_client/CMakeLists.txt)

Library: dev/src_lib/CMakeLists.txt

add_library(wof_static STATIC ${LIB_SRC})
TARGET_LINK_LIBRARIES(wof_static ${CMAKE_CURRENT_SOURCE_DIR}/3rdParty/lex/libs/amd64/libLexActivator.a pthread libnss3.so /usr/lib/x86_64-linux-gnu/libssl3.so /usr/lib/x86_64-linux-gnu/libnspr4.so )

Executable: dev/src_client/CMakeLists.txt

add_executable(wof ${CLIENT_SRC})
TARGET_LINK_LIBRARIES( wof
                            ${CMAKE_CURRENT_SOURCE_DIR}/build/libwof_static.a
                            ${CMAKE_CURRENT_SOURCE_DIR}/src_lib/3rdParty/lex/libs/amd64/libLexActivator.a
                                gmp
                                pthread
                                libnss3.so
                                /usr/lib/x86_64-linux-gnu/libssl3.so
                                /usr/lib/x86_64-linux-gnu/libnspr4.so
                                )

The above TARGET_LINK_LIBRARIES command uses the filename libwof_static.a, and thus, the build is out of order (i.e., it works only when I call make twice). Thus, I need to let CMake know that the executable depends on the library-target wof_static, right? I tried to do so:

Executable: dev/src_client/CMakeLists.txt (variant)

link_directories(${CMAKE_CURRENT_SOURCE_DIR}/build/ ${CMAKE_CURRENT_SOURCE_DIR}/src_lib/3rdParty/lex/libs/amd64/)
add_executable(wof ${CLIENT_SRC})

TARGET_LINK_LIBRARIES(  wof
                        wof_static
                        ${CMAKE_CURRENT_SOURCE_DIR}/src_lib/3rdParty/lex/libs/amd64/libLexActivator.a
                        gmp
                        pthread
                        libnss3.so
                        /usr/lib/x86_64-linux-gnu/libssl3.so
                        /usr/lib/x86_64-linux-gnu/libnspr4.so
                        )

The intention of the above is to let CMake know the target name wof_static. That seems to work because the compilation of the executable wof starts when the library is ready. But I assumed that CMake would know and use the output file libwof_static.a of the target wof_static. This does not seem to be true. The error I get is:

[ 94%] Linking CXX static library libwof_static.a
/usr/local/bin/cmake -P CMakeFiles/wof_static.dir/cmake_clean_target.cmake
/usr/local/bin/cmake -E cmake_link_script CMakeFiles/wof_static.dir/link.txt --verbose=1
/usr/bin/ar qc libwof_static.a  CMakeFiles/wof_static.dir/src_lib/AngleEntry.cpp.o CMakeFiles/wof_static.dir/src_lib/CEdge.cpp.o CMakeFiles/wof_static.dir/src_lib/CMesh.cpp.o CMakeFiles/wof_static.dir/src_lib/CPatch.cpp.o CMakeFiles/wof_static.dir/src_lib/CTriangle.cpp.o CMakeFiles/wof_static.dir/src_lib/Calc.cpp.o CMakeFiles/wof_static.dir/src_lib/Casx.cpp.o CMakeFiles/wof_static.dir/src_lib/Chain.cpp.o CMakeFiles/wof_static.dir/src_lib/ChainMgr.cpp.o CMakeFiles/wof_static.dir/src_lib/Cloud.cpp.o CMakeFiles/wof_static.dir/src_lib/CloudMgr.cpp.o CMakeFiles/wof_static.dir/src_lib/Hal.cpp.o CMakeFiles/wof_static.dir/src_lib/Histogram.cpp.o CMakeFiles/wof_static.dir/src_lib/HoleFiller.cpp.o CMakeFiles/wof_static.dir/src_lib/HoleToCCD.cpp.o CMakeFiles/wof_static.dir/src_lib/Inspector.cpp.o CMakeFiles/wof_static.dir/src_lib/Iso.cpp.o CMakeFiles/wof_static.dir/src_lib/IsoStore.cpp.o CMakeFiles/wof_static.dir/src_lib/LexSample.cpp.o CMakeFiles/wof_static.dir/src_lib/Loop.cpp.o CMakeFiles/wof_static.dir/src_lib/Performance.cpp.o CMakeFiles/wof_static.dir/src_lib/Pixel.cpp.o CMakeFiles/wof_static.dir/src_lib/Plane.cpp.o CMakeFiles/wof_static.dir/src_lib/Posix.cpp.o CMakeFiles/wof_static.dir/src_lib/Rotx.cpp.o CMakeFiles/wof_static.dir/src_lib/Segment3.cpp.o CMakeFiles/wof_static.dir/src_lib/Smooth.cpp.o CMakeFiles/wof_static.dir/src_lib/Surve.cpp.o CMakeFiles/wof_static.dir/src_lib/Top.cpp.o CMakeFiles/wof_static.dir/src_lib/TopMelt.cpp.o CMakeFiles/wof_static.dir/src_lib/Vector3.cpp.o CMakeFiles/wof_static.dir/src_lib/Visualizer3.cpp.o CMakeFiles/wof_static.dir/src_lib/Voro.cpp.o CMakeFiles/wof_static.dir/src_lib/Wof.cpp.o CMakeFiles/wof_static.dir/src_lib/WofMesh.cpp.o CMakeFiles/wof_static.dir/src_lib/api.cpp.o CMakeFiles/wof_static.dir/src_lib/api_io.cpp.o CMakeFiles/wof_static.dir/src_lib/devStuff.cpp.o CMakeFiles/wof_static.dir/src_lib/freeFunctions.cpp.o CMakeFiles/wof_static.dir/src_lib/geom_locate3/Node.cpp.o CMakeFiles/wof_static.dir/src_lib/geom_locate3/RTree.cpp.o CMakeFiles/wof_static.dir/src_lib/geom_octree/OctNode.cpp.o CMakeFiles/wof_static.dir/src_lib/geom_octree/Octree.cpp.o CMakeFiles/wof_static.dir/src_lib/geom_tools/GSS_HC2.cpp.o CMakeFiles/wof_static.dir/src_lib/geom_tools/GSS_HC3.cpp.o CMakeFiles/wof_static.dir/src_lib/testDataGenerators.cpp.o CMakeFiles/wof_static.dir/src_lib/tinyply.cpp.o CMakeFiles/wof_static.dir/src_lib/tools.cpp.o
/usr/bin/ranlib libwof_static.a
make[2]: Leaving directory '/home/geom/repoWOF/dev/build'
[ 94%] Built target wof_static
make -f CMakeFiles/wof.dir/build.make CMakeFiles/wof.dir/depend
make[2]: Entering directory '/home/geom/repoWOF/dev/build'
cd /home/geom/repoWOF/dev/build && /usr/local/bin/cmake -E cmake_depends "Unix Makefiles" /home/geom/repoWOF/dev /home/geom/repoWOF/dev /home/geom/repoWOF/dev/build /home/geom/repoWOF/dev/build /home/geom/repoWOF/dev/build/CMakeFiles/wof.dir/DependInfo.cmake --color=
make[2]: Leaving directory '/home/geom/repoWOF/dev/build'
make -f CMakeFiles/wof.dir/build.make CMakeFiles/wof.dir/build
make[2]: Entering directory '/home/geom/repoWOF/dev/build'
[ 96%] Building CXX object CMakeFiles/wof.dir/src_client/Params.cpp.o
[ 98%] Building CXX object CMakeFiles/wof.dir/src_client/main.cpp.o
make[2]: *** No rule to make target '../3rdParty/lex/libs/amd64/libLexActivator.a', needed by 'wof'.  Stop.
make[2]: *** Waiting for unfinished jobs....
/usr/bin/c++   -I/home/geom/repoWOF/dev/include  -O3 -DNDEBUG   -std=c++11 -fstrict-aliasing -Wno-unused-local-typedefs -Wno-long-long -O3 -Wextra -Wunused -Wall  -pedantic-errors -frounding-math -funroll-loops -Wl,-s -o CMakeFiles/wof.dir/src_client/Params.cpp.o -c /home/geom/repoWOF/dev/src_client/Params.cpp
/usr/bin/c++   -I/home/geom/repoWOF/dev/include  -O3 -DNDEBUG   -std=c++11 -fstrict-aliasing -Wno-unused-local-typedefs -Wno-long-long -O3 -Wextra -Wunused -Wall  -pedantic-errors -frounding-math -funroll-loops -Wl,-s -o CMakeFiles/wof.dir/src_client/main.cpp.o -c /home/geom/repoWOF/dev/src_client/main.cpp
make[2]: Leaving directory '/home/geom/repoWOF/dev/build'
CMakeFiles/Makefile2:112: recipe for target 'CMakeFiles/wof.dir/all' failed
make[1]: *** [CMakeFiles/wof.dir/all] Error 2
make[1]: Leaving directory '/home/geom/repoWOF/dev/build'
Makefile:86: recipe for target 'all' failed
make: *** [all] Error 2

Upvotes: 1

Views: 619

Answers (1)

Kevin
Kevin

Reputation: 18243

In your file dev/src_client/CMakeLists.txt, this line:

${CMAKE_CURRENT_SOURCE_DIR}/src_lib/3rdParty/lex/libs/amd64/libLexActivator.a

evaluates to the path:

dev/src_client/src_lib/3rdParty/lex/libs/amd64/libLexActivator.a

I don't think that is what you intend, as this path is different from the path you use in the dev/src_lib/CMakeLists.txt file.

Instead of CMAKE_CURRENT_SOURCE_DIR, use the CMake variable that points to the root source directory: CMAKE_SOURCE_DIR. Try something like this:

TARGET_LINK_LIBRARIES(  wof
                        wof_static
                        ${CMAKE_SOURCE_DIR}/src_lib/3rdParty/lex/libs/amd64/libLexActivator.a
                        gmp
                        pthread
                        libnss3.so
                        /usr/lib/x86_64-linux-gnu/libssl3.so
                        /usr/lib/x86_64-linux-gnu/libnspr4.so
                        )

Upvotes: 1

Related Questions