Как найти библиотеку с помощью cmake? - PullRequest
12 голосов
/ 01 августа 2010

Чтобы связать исполняемый файл с библиотекой, которая находится в стандартном месте, можно сделать следующее в файле CmakeLists.txt:

create_executable(generate_mesh generate_mesh.cpp)
target_link_libraries(generate_mesh OpenMeshCore)

Это сработало бы, если бы библиотека, с которой связаны ссылки, была помещена в

/usr/local/lib/libOpenMeshCore.dylib

Однако в этом случае библиотека находится под

/usr/local/lib/OpenMesh/libOpenMeshCore.dylib

Как я могу указать, что target_link_libraries действительно должен ссылаться на библиотеку, размещенную в sibdirectory? Интересно, что для target_link_libraries есть некоторая полезная опция, которая указывает, что библиотека находится в подкаталоге в стандартном месте, например

target_link_libraries(generate_mesh OpenMesh/OpenMeshCore)

Если это невозможно, есть ли способ использовать find_library для рекурсивного поиска /usr/local/lib, включая его подкаталоги, для данного файла библиотеки?

1 Ответ

22 голосов
/ 02 августа 2010

Вы можете добавить различные каталоги к find_library. Чтобы использовать эту библиотеку, вызовите cmake cmake -DFOO_PREFIX=/some/path ....

find_library( CPPUNIT_LIBRARY_DEBUG NAMES cppunit cppunit_dll cppunitd cppunitd_dll
            PATHS   ${FOO_PREFIX}/lib
                    /usr/lib
                    /usr/lib64
                    /usr/local/lib
                    /usr/local/lib64
            PATH_SUFFIXES debug )

find_library( CPPUNIT_LIBRARY_RELEASE NAMES cppunit cppunit_dll
            PATHS   ${FOO_PREFIX}/lib
                    /usr/lib
                    /usr/lib64
                    /usr/local/lib
                    /usr/local/lib64
            PATH_SUFFIXES release )

if(CPPUNIT_LIBRARY_DEBUG AND NOT CPPUNIT_LIBRARY_RELEASE)
    set(CPPUNIT_LIBRARY_RELEASE ${CPPUNIT_LIBRARY_DEBUG})
endif(CPPUNIT_LIBRARY_DEBUG AND NOT CPPUNIT_LIBRARY_RELEASE)

set( CPPUNIT_LIBRARY debug     ${CPPUNIT_LIBRARY_DEBUG}
                    optimized ${CPPUNIT_LIBRARY_RELEASE} )

# ...
target_link_libraries(foo ${CPPUNIT_LIBRARY})
...