Hi Eric,
yes, this is the project. I have pushed my current state to this branch https://github.com/DamirPorobic/kImageAnnotator/tree/sharedLibTestBranch I've tried also without the generate_export_headers (cleaned everything up before trying out) but I get the same result. KImageAnnotator::KImageAnnotator(QPixmap const&)should be exposed by the handwritten file, that's true, I think I got something mixed up there and I don't actually need the generate_export_headers, but as said, even without the line, it's not working. Cheers, Damir ________________________________ From: Eric Noulard <eric.noul...@gmail.com> Sent: Sunday, August 19, 2018 22:44 To: Damir Porobic Cc: smanc...@jlab.org; CMake Mailinglist Subject: Re: [CMake] Problem with creating shared library Hi Damir, May be the issue has nothing to do with the way you build the exported <>Config.cmake files. Since may be some nasty detail slipped in, could you tell us if the project is public. It looks like this one: https://github.com/DamirPorobic/kImageAnnotator may be you can push a branch that contains the exact thing that fails on your side and it may be easier to review the detail? on the master of this repo there does not seem to have any "example" dir. However you already have hand written header file: https://github.com/DamirPorobic/kImageAnnotator/blob/master/src/gui/KImageAnnotator.h which has the very same name as the "exported header you generate": generate_export_header(kImageAnnotator EXPORT_MACRO_NAME KIMAGEANNOTATOR_API EXPORT_FILE_NAME ${CMAKE_BINARY_DIR}/include/KImageAnnotator.h ) so may be KImageAnnotator::KImageAnnotator(QPixmap const&) is exposed by the hand-written file and not by the generated one so that your unit test links ok but your "example" does not ? Did you check the content of the generated header file? Le dim. 19 août 2018 à 15:17, Damir Porobic <damir_poro...@live.com<mailto:damir_poro...@live.com>> a écrit : Thanks Sebastián for providing those links! I've followed the second link that you've provided but somehow I'm still running into issue. I've changed the directory structure to this: - kImageAnnotator - cmake - kImageAnnotator-config.cmake.in<http://config.cmake.in> - example - main.cpp - CMakeLists.txt - include - kImageAnnotator - KImageAnnotator.h // the main api header - src - KImageAnnotator.cpp - "And all other .cpp and .h files" - CMakeLists.txt - CMakeLists.txt src/CMakeList.txt looks like this: add_library(kImageAnnotator ${kimageannotator_SRCS} ${CMAKE_SOURCE_DIR}/include/kImageAnnotator/KImageAnnotator.h) add_library(kImageAnnotator::kImageAnnotator ALIAS kImageAnnotator) option(BUILD_SHARED_LIBS "Build shared library" ON) include(GenerateExportHeader) generate_export_header(kImageAnnotator EXPORT_MACRO_NAME KIMAGEANNOTATOR_API EXPORT_FILE_NAME ${CMAKE_BINARY_DIR}/include/KImageAnnotator.h ) target_include_directories(kImageAnnotator PUBLIC $<BUILD_INTERFACE:${CMAKE_SOURCE_DIR}/include> $<BUILD_INTERFACE:${CMAKE_BINARY_DIR}/include> $<INSTALL_INTERFACE:include> PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} ) set_target_properties(kImageAnnotator PROPERTIES ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin ) find_package(Qt5 ${QT_MIN_VERSION} REQUIRED Widgets) find_package(KF5 ${KF5_MIN_VERSION} REQUIRED COMPONENTS CoreAddons I18n WidgetsAddons) target_link_libraries(kImageAnnotator Qt5::Widgets KF5::CoreAddons KF5::I18n KF5::WidgetsAddons) include(GNUInstallDirs) install(TARGETS kImageAnnotator EXPORT kImageAnnotator-targets ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} INCLUDES DESTINATION ${LIBLEGACY_INCLUDE_DIRS} ) install(DIRECTORY ${CMAKE_SOURCE_DIR}/include/kImageAnnotator DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} ) install(EXPORT kImageAnnotator-targets FILE kImageAnnotator-targets.cmake NAMESPACE kImageAnnotator:: DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/kImageAnnotator ) include(CMakePackageConfigHelpers) configure_package_config_file( ${CMAKE_SOURCE_DIR}/cmake/kImageAnnotator-config.cmake.in<http://kImageAnnotator-config.cmake.in> ${CMAKE_BINARY_DIR}/cmake/kImageAnnotator-config.cmake INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/kImageAnnotator ) write_basic_package_version_file( ${CMAKE_BINARY_DIR}/cmake/kImageAnnotator-config-version.cmake VERSION ${PROJECT_VERSION} COMPATIBILITY AnyNewerVersion ) install(FILES ${CMAKE_BINARY_DIR}/cmake/kImageAnnotator-config.cmake ${CMAKE_BINARY_DIR}/cmake/kImageAnnotator-config-version.cmake DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/kImageAnnotator ) export(EXPORT kImageAnnotator-targets FILE ${CMAKE_BINARY_DIR}/cmake/kImageAnnotator-targets.cmake NAMESPACE kImageAnnotator:: ) kImageAnnotator-config.cmake.in<http://kImageAnnotator-config.cmake.in> looks like this: include(CMakeFindDependencyMacro) @PACKAGE_INIT@ # find_dependency(Threads) find_package(Qt5 ${QT_MIN_VERSION} REQUIRED Widgets) find_package(KF5 ${KF5_MIN_VERSION} REQUIRED COMPONENTS CoreAddons I18n WidgetsAddons) if(NOT TARGET kImageAnnotator::kImageAnnotator) include("${CMAKE_CURRENT_LIST_DIR}/kImageAnnotator-targets.cmake") endif() example/CMakeLists.txt looks like this: add_executable(kImageAnnotator-example ${CMAKE_CURRENT_SOURCE_DIR}/main.cpp) target_link_libraries(kImageAnnotator-example PRIVATE kImageAnnotator::kImageAnnotator) And example/main.cpp looks like this: #include <QApplication> #include <kImageAnnotator/KImageAnnotator.h> int main(int argc, char **argv) { QApplication app(argc, argv); QPixmap pixmap(QSize(500, 500)); pixmap.fill(QColor(Qt::darkGreen)); auto kImageAnnotator = new KImageAnnotator(pixmap); kImageAnnotator->show(); return app.exec(); } Still I'm getting following error when trying to build kImageAnnotator-example: Scanning dependencies of target kImageAnnotator-example [ 98%] Building CXX object example/CMakeFiles/kImageAnnotator-example.dir/main.cpp.o [ 98%] Building CXX object example/CMakeFiles/kImageAnnotator-example.dir/kImageAnnotator-example_autogen/mocs_compilation.cpp.o [100%] Linking CXX executable kImageAnnotator-example CMakeFiles/kImageAnnotator-example.dir/main.cpp.o: In function `main': /home/dporobic/projects/kImageAnnotator/example/main.cpp:29: undefined reference to `KImageAnnotator::KImageAnnotator(QPixmap const&)' collect2: error: ld returned 1 exit status example/CMakeFiles/kImageAnnotator-example.dir/build.make:98: recipe for target 'example/kImageAnnotator-example' failed Any idea what I'm doing wrong? It looks like the same issue that I was having earlier. ________________________________ From: Sebastián Mancilla <smanc...@jlab.org<mailto:smanc...@jlab.org>> Sent: Wednesday, August 15, 2018 21:48 To: damir_poro...@live.com<mailto:damir_poro...@live.com> Cc: cmake@cmake.org<mailto:cmake@cmake.org> Subject: Re: [CMake] Problem with creating shared library You are mixing the config file and the targets file. The config file is a template that you normally put in cmake/FooConfig.cmake.in<http://FooConfig.cmake.in> You copy the template into the binary dir: include(CMakePackageConfigHelpers) set(INSTALL_CONFIGDIR lib/cmake/Foo) configure_package_config_file( "${CMAKE_CURRENT_LIST_DIR}/cmake/FooConfig.cmake.in<http://FooConfig.cmake.in>" "${CMAKE_CURRENT_BINARY_DIR}/FooConfig.cmake" INSTALL_DESTINATION ${INSTALL_CONFIGDIR} ) It is a good idea to create a version file: write_basic_package_version_file( "${CMAKE_CURRENT_BINARY_DIR}/FooConfigVersion.cmake" VERSION ${PROJECT_VERSION} COMPATIBILITY SameMajorVersion ) And then install both: install(FILES "${CMAKE_CURRENT_BINARY_DIR}/FooConfig.cmake" "${CMAKE_CURRENT_BINARY_DIR}/FooConfigVersion.cmake" DESTINATION ${INSTALL_CONFIGDIR} COMPONENT Devel ) For the targets is a different file. When you install the library you should use install(TARGETS Foo EXPORT FooTargets ...) And then export and install the targets: # Into the build tree export(EXPORT FooTargets FILE "${CMAKE_CURRENT_BINARY_DIR}/FooTargets.cmake" NAMESPACE Foo:: ) # Into PREFIX install(EXPORT FooTargets FILE FooTargets.cmake NAMESPACE Foo:: DESTINATION ${INSTALL_CONFIGDIR} COMPONENT Devel ) Finally, your template FooConfig.cmake.in<http://FooConfig.cmake.in> should look like this: include(CMakeFindDependencyMacro) @PACKAGE_INIT@ # list your required dependencies here find_dependency(Threads) if(NOT TARGET Foo::Foo) include("${CMAKE_CURRENT_LIST_DIR}/FooTargets.cmake") endif() All this is pretty much the same for any project. Here are the best links explaining it: https://pabloariasal.github.io/2018/02/19/its-time-to-do-cmake-right/ http://unclejimbo.github.io/2018/06/08/Modern-CMake-for-Library-Developers/ El mié., 15 de ago. de 2018 a la(s) 05:32, Damir Porobic (damir_poro...@live.com<mailto:damir_poro...@live.com>) escribió: Hi Folks, I'm trying to write a shared library and run into an issue where I can't find any clues to where the problem is. I have a project with following structure: src/ dir1/ file1.h file1.cpp dir2/ file2.h file2.cpp Now I have this CMakeList: cmake_minimum_required(VERSION 3.5) project(kImageAnnotator VERSION 0.0.1 LANGUAGES CXX) ... add_library(${PROJECT_NAME} SHARED ${kimageannotator_SRCS}) target_link_libraries(${PROJECT_NAME} Qt5::Widgets KF5::CoreAddons KF5::I18n KF5::WidgetsAddons) target_include_directories(${PROJECT_NAME} PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}> $<INSTALL_INTERFACE:include>) set_target_properties(${PROJECT_NAME} PROPERTIES VERSION ${PROJECT_VERSION} SOVERSION 1) set(kimageannotator_CONFIG ${PROJECT_NAME}Config) install(TARGETS ${PROJECT_NAME} EXPORT ${kimageannotator_CONFIG} ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME}) install(EXPORT ${kimageannotator_CONFIG} DESTINATION share/${kimageannotator_CONFIG}/cmake) export(TARGETS ${PROJECT_NAME} FILE ${kimageannotator_CONFIG}.cmake) In another test project, I add the library like this: ... find_package(kImageAnnotator REQUIRED) add_executable(testApp main.cpp) target_link_libraries(testApp Qt5::Widgets kImageAnnotator) Now when I try to build my test project, I get this: dporobic@linux ~/projects/testApp/build $ cmake .. && make -- Could not set up the appstream test. appstreamcli is missing. -- Configuring done -- Generating done -- Build files have been written to: /home/dporobic/projects/testApp/build [ 25%] Automatic moc for target testApp [ 25%] Built target testApp_automoc Scanning dependencies of target testApp [ 50%] Building CXX object CMakeFiles/testApp.dir/main.cpp.o [ 75%] Building CXX object CMakeFiles/testApp.dir/testApp_automoc.cpp.o [100%] Linking CXX executable testApp CMakeFiles/testApp.dir/main.cpp.o: In function `main': main.cpp:(.text+0x8e): undefined reference to `KImageAnnotator::KImageAnnotator(QPixmap const&)' collect2: error: ld returned 1 exit status CMakeFiles/testApp.dir/build.make:120: recipe for target 'testApp' failed make[2]: *** [testApp] Error 1 CMakeFiles/Makefile2:67: recipe for target 'CMakeFiles/testApp.dir/all' failed make[1]: *** [CMakeFiles/testApp.dir/all] Error 2 Makefile:94: recipe for target 'all' failed make: *** [all] Error 2 Any idea how I could/should troubleshoot such issue? Thanks in advance! Regards, Damir -- Powered by www.kitware.com<http://www.kitware.com> Please keep messages on-topic and check the CMake FAQ at: https://urldefense.proofpoint.com/v2/url?u=http-3A__www.cmake.org_Wiki_CMake-5FFAQ&d=DwICAg&c=lz9TcOasaINaaC3U7FbMev2lsutwpI4--09aP8Lu18s&r=8hmSv9ww5s9qu3iT8h5WMi8-YcKXaJvelxT3fMih7S4&m=1H4kXxGuNG-DAo1qM-u8bdF6AKKHkJoiCuqwZ4QLvtY&s=JJ5RqPyjdlGGc3fT-5nQQM-JcJzwjBZU6ciOQlmEJVs&e= Kitware offers various services to support the CMake community. For more information on each offering, please visit: CMake Support: https://urldefense.proofpoint.com/v2/url?u=http-3A__cmake.org_cmake_help_support.html&d=DwICAg&c=lz9TcOasaINaaC3U7FbMev2lsutwpI4--09aP8Lu18s&r=8hmSv9ww5s9qu3iT8h5WMi8-YcKXaJvelxT3fMih7S4&m=1H4kXxGuNG-DAo1qM-u8bdF6AKKHkJoiCuqwZ4QLvtY&s=vUHQvc_7Ovi_5BDjy3JYFOIvTmihTSFOQNndNSpMOnA&e= CMake Consulting: https://urldefense.proofpoint.com/v2/url?u=http-3A__cmake.org_cmake_help_consulting.html&d=DwICAg&c=lz9TcOasaINaaC3U7FbMev2lsutwpI4--09aP8Lu18s&r=8hmSv9ww5s9qu3iT8h5WMi8-YcKXaJvelxT3fMih7S4&m=1H4kXxGuNG-DAo1qM-u8bdF6AKKHkJoiCuqwZ4QLvtY&s=91AJA3BxTfHAvsi0mAzkszAyUUmE2xfwbLgN_fYvFO4&e= CMake Training Courses: https://urldefense.proofpoint.com/v2/url?u=http-3A__cmake.org_cmake_help_training.html&d=DwICAg&c=lz9TcOasaINaaC3U7FbMev2lsutwpI4--09aP8Lu18s&r=8hmSv9ww5s9qu3iT8h5WMi8-YcKXaJvelxT3fMih7S4&m=1H4kXxGuNG-DAo1qM-u8bdF6AKKHkJoiCuqwZ4QLvtY&s=isQW6paMIqhUFaejOZ4qfUiSVwNiR1yxoQn4J91yb8o&e= Visit other Kitware open-source projects at https://urldefense.proofpoint.com/v2/url?u=http-3A__www.kitware.com_opensource_opensource.html&d=DwICAg&c=lz9TcOasaINaaC3U7FbMev2lsutwpI4--09aP8Lu18s&r=8hmSv9ww5s9qu3iT8h5WMi8-YcKXaJvelxT3fMih7S4&m=1H4kXxGuNG-DAo1qM-u8bdF6AKKHkJoiCuqwZ4QLvtY&s=ose8YVW10s6tWkujUCq162vyyipCdlw-MW93qUlqdGk&e= Follow this link to subscribe/unsubscribe: https://urldefense.proofpoint.com/v2/url?u=https-3A__cmake.org_mailman_listinfo_cmake&d=DwICAg&c=lz9TcOasaINaaC3U7FbMev2lsutwpI4--09aP8Lu18s&r=8hmSv9ww5s9qu3iT8h5WMi8-YcKXaJvelxT3fMih7S4&m=1H4kXxGuNG-DAo1qM-u8bdF6AKKHkJoiCuqwZ4QLvtY&s=KftR51q4EGgNERicS2QyHvzlrNaqb11IUwwbz1YTjVU&e= -- Sebastian Mancilla Matta CCTVal, UTFSM Valparaíso, Chile -- Powered by www.kitware.com<http://www.kitware.com> Please keep messages on-topic and check the CMake FAQ at: http://www.cmake.org/Wiki/CMake_FAQ Kitware offers various services to support the CMake community. For more information on each offering, please visit: CMake Support: http://cmake.org/cmake/help/support.html CMake Consulting: http://cmake.org/cmake/help/consulting.html CMake Training Courses: http://cmake.org/cmake/help/training.html Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html Follow this link to subscribe/unsubscribe: https://cmake.org/mailman/listinfo/cmake -- Eric
-- Powered by www.kitware.com Please keep messages on-topic and check the CMake FAQ at: http://www.cmake.org/Wiki/CMake_FAQ Kitware offers various services to support the CMake community. For more information on each offering, please visit: CMake Support: http://cmake.org/cmake/help/support.html CMake Consulting: http://cmake.org/cmake/help/consulting.html CMake Training Courses: http://cmake.org/cmake/help/training.html Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html Follow this link to subscribe/unsubscribe: https://cmake.org/mailman/listinfo/cmake