0

I am currently trying to build a conan package. Part of that is to prebuild a static library using cmake(repo). At the moment I can not figure out how to link the generated static lib inside another build.

  1. The library I am building is flecs
  2. Using flecs inside a cmake sub directory works fine
  3. Using the generated lib seems to be not enough for cmake to be able to link

working sample using cmake sub directory:

cmake_minimum_required(VERSION 2.8.7)

project(flecs_project)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_C_STANDARD 99)

add_subdirectory(flecs)

add_executable(flecs_project)
target_sources(flecs_project PRIVATE
        helloworld/include/helloworld.h
        helloworld/src/main.cpp)

target_include_directories(flecs_project PRIVATE flecs/include)
target_include_directories(flecs_project PRIVATE helloworld/include)

target_link_libraries(flecs_project PRIVATE flecs_static)

not working sample using lib

cmake_minimum_required(VERSION 2.8.7)

project(flecs_project)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_C_STANDARD 99)

add_executable(flecs_project)
target_sources(flecs_project PRIVATE
        helloworld/include/helloworld.h
        helloworld/src/main.cpp)

target_include_directories(flecs_project PRIVATE flecs/include)
target_include_directories(flecs_project PRIVATE helloworld/include)

target_link_libraries(flecs_project "E:\\Workspace\\flecs-project\\cmake-build-release\\flecs\\flecs_static.lib")

I am sure there is something I have not understood about static linkage, but I can not find any resources about what I am missing here.

Thanks for everyone who tries to help!

Edit 2:

As @Tsyvarev pointed out the header I was using needed to have the flecs_STATIC - flag set to be used for static linkage.

Now I get the following make output

[ I will try to fix that myself. But if you have any suggestions I would appreciate them. :-) ]

"C:\Program Files\CMake\bin\cmake.exe" --build E:\Workspace\flecs-project\cmake-build-release --target flecs_project
Scanning dependencies of target flecs_project
[ 50%] Building CXX object CMakeFiles/flecs_project.dir/helloworld/src/main.cpp.obj
main.cpp
NMAKE : fatal error U1073: don't know how to make '..\flecs_static.lib'
Stop.
NMAKE : fatal error U1077: '"C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.27.29110\bin\HostX64\x64\nmake.exe"' : return code '0x2'
Stop.
NMAKE : fatal error U1077: '"C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.27.29110\bin\HostX64\x64\nmake.exe"' : return code '0x2'
Stop.
NMAKE : fatal error U1077: '"C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.27.29110\bin\HostX64\x64\nmake.exe"' : return code '0x2'
Stop.

EDIT 1:

Original linker output:

LINK: command "C:\PROGRA~2\MICROS~1\2019\COMMUN~1\VC\Tools\MSVC\1427~1.291\bin\Hostx64\x64\link.exe /nologo @CMakeFiles\flecs_project.dir\objects1.rsp /out:flecs_project.exe /implib:flecs_project.lib /pdb:E:\Workspace\flecs-project\cmake-build-release\flecs_project.pdb /version:0.0 /machine:x64 /INCREMENTAL:NO /subsystem:console ..\flecs_static.lib kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib /MANIFEST /MANIFESTFILE:flecs_project.exe.manifest" failed (exit code 1120) with the following output:
main.cpp.obj : error LNK2019: unresolved external symbol __imp_ecs_new_component referenced in function "class flecs::entity __cdecl flecs::pod_component<struct EcsComponent>(class flecs::world const &,char const *,bool)" (??$pod_component@UEcsComponent@@@flecs@@YA?AVentity@0@AEBVworld@0@PEBD_N@Z)
main.cpp.obj : error LNK2019: unresolved external symbol __imp_ecs_component_has_actions referenced in function "void __cdecl flecs::_::register_lifecycle_actions<struct Position>(struct ecs_world_t *,unsigned __int64,bool,bool,bool,bool)" (??$register_lifecycle_actions@UPosition@@@_@flecs@@YAXPEAUecs_world_t@@_K_N222@Z)
main.cpp.obj : error LNK2019: unresolved external symbol __imp_ecs_init_w_args referenced in function "public: __cdecl flecs::world::world(int,char * * const)" (??0world@flecs@@QEAA@HQEAPEAD@Z)
main.cpp.obj : error LNK2019: unresolved external symbol __imp_ecs_fini referenced in function "public: __cdecl flecs::world::~world(void)" (??1world@flecs@@QEAA@XZ)
main.cpp.obj : error LNK2019: unresolved external symbol __imp_ecs_set_component_actions_w_entity referenced in function "void __cdecl flecs::_::register_lifecycle_actions<struct Position>(struct ecs_world_t *,unsigned __int64,bool,bool,bool,bool)" (??$register_lifecycle_actions@UPosition@@@_@flecs@@YAXPEAUecs_world_t@@_K_N222@Z)
main.cpp.obj : error LNK2019: unresolved external symbol __imp_ecs_new_component_id referenced in function "public: __cdecl flecs::entity::entity(class flecs::world const &,char const *,bool)" (??0entity@flecs@@QEAA@AEBVworld@1@PEBD_N@Z)
main.cpp.obj : error LNK2019: unresolved external symbol __imp_ecs_get_w_entity referenced in function "public: struct Position const * __cdecl flecs::entity::get<struct Position>(void)const " (??$get@UPosition@@@entity@flecs@@QEBAPEBUPosition@@XZ)
main.cpp.obj : error LNK2019: unresolved external symbol __imp_ecs_set_ptr_w_entity referenced in function "public: void __cdecl flecs::entity::invoke<class <lambda_4741e5ecf4b2316809d844be84aba778> >(class <lambda_4741e5ecf4b2316809d844be84aba778> &&)const " (??$invoke@V<lambda_4741e5ecf4b2316809d844be84aba778>@@@entity@flecs@@QEBAX$$QEAV<lambda_4741e5ecf4b2316809d844be84aba778>@@@Z)
main.cpp.obj : error LNK2019: unresolved external symbol __imp_ecs_get_type referenced in function "class flecs::entity __cdecl flecs::pod_component<struct EcsComponent>(class flecs::world const &,char const *,bool)" (??$pod_component@UEcsComponent@@@flecs@@YA?AVentity@0@AEBVworld@0@PEBD_N@Z)
main.cpp.obj : error LNK2019: unresolved external symbol __imp_ecs_lookup_path_w_sep referenced in function "public: class flecs::entity __cdecl flecs::world::entity<char const (&)[9]>(char const (&)[9])const " (??$entity@AEAY08$$CBD@world@flecs@@QEBA?AVentity@1@AEAY08$$CBD@Z)
main.cpp.obj : error LNK2019: unresolved external symbol __imp_ecs_get_path_w_sep referenced in function "class flecs::entity __cdecl flecs::pod_component<struct EcsComponent>(class flecs::world const &,char const *,bool)" (??$pod_component@UEcsComponent@@@flecs@@YA?AVentity@0@AEBVworld@0@PEBD_N@Z)
main.cpp.obj : error LNK2019: unresolved external symbol __imp_ecs_add_path_w_sep referenced in function "public: class flecs::entity __cdecl flecs::world::entity<char const (&)[9]>(char const (&)[9])const " (??$entity@AEAY08$$CBD@world@flecs@@QEBA?AVentity@1@AEAY08$$CBD@Z)
main.cpp.obj : error LNK2019: unresolved external symbol __imp_ecs_os_api referenced in function "class flecs::entity __cdecl flecs::pod_component<struct EcsComponent>(class flecs::world const &,char const *,bool)" (??$pod_component@UEcsComponent@@@flecs@@YA?AVentity@0@AEBVworld@0@PEBD_N@Z)
flecs_project.exe : fatal error LNK1120: 13 unresolved externals
NMAKE : fatal error U1077: '"C:\Program Files\CMake\bin\cmake.exe"' : return code '0xffffffff'
Stop.
NMAKE : fatal error U1077: '"C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.27.29110\bin\HostX64\x64\nmake.exe"' : return code '0x2'
Stop.
NMAKE : fatal error U1077: '"C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.27.29110\bin\HostX64\x64\nmake.exe"' : return code '0x2'
Stop.
NMAKE : fatal error U1077: '"C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.27.29110\bin\HostX64\x64\nmake.exe"' : return code '0x2'
Stop.
  • 2
    The correct way using Conan is packaging flecs first, and then package your project. That's because Conan is a package manager, and distributing all dependencies as separated packages make life easier when building. But being more specific, which error do you see? Could you update your description with the error output? – uilianries Jan 27 '21 at 14:25
  • I am not trying to package my own project. I am trying to package flecs itself. This is just the same error I get when trying to use the conan package I create. Ive added a link to my repo if you need to see more of what I am trying to achieve. – Robert Andreas Fritsch Jan 27 '21 at 15:26
  • 1
    The prefix `__imp` of the symbols in the error messages [means](https://stackoverflow.com/questions/5159353/how-can-i-get-rid-of-the-imp-prefix-in-the-linker-in-vc) that these symbols are defined in the **dynamic** library, not in the *static* one. In flecs project, their [CMakeLists.txt](https://github.com/SanderMertens/flecs/blob/master/CMakeLists.txt) associates `flecs_STATIC` macro definition with the static library. It seems you need to define this macro for your executable if you want to link it with the static library instead of the dynamic one. – Tsyvarev Jan 27 '21 at 17:11
  • @Tsyvarev that is really nice to know, thanks! I will try that. – Robert Andreas Fritsch Jan 27 '21 at 17:23
  • The flecs_STATIC flag fixed the problem entirely inside my conan-flecs project. Not sure, why it does not compile in my "simple sandbox" yet. Many thanks! – Robert Andreas Fritsch Jan 27 '21 at 17:55

0 Answers0