Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to use libxml2 with CMake?

Tags:

cmake

libxml2

I am using CLion editor (with CMake) for my C project, I've never used an external library though, my question is how do I link an external lib (for ex. libxml2) to my project? I've seen some questions similar to this but none worked for me. My project is compiled on Windows, and I have libxml .dll, include, and .lib files(binaries for Windows).

Edit: My CMakeLists.txt file after the answer suggested:

cmake_minimum_required(VERSION 3.2)
project(time_table)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")

set(SOURCE_FILES
    course.c
    course.h
    day.h
    defines.h
    find_tables.c
    find_tables.h
    item.h
    parse_info.c
    parse_info.h
    table.c
    table.h
    time_table.c grades.c grades.h)

link_libraries(C:/Users/Gal/Desktop/time_table/libxml2-2.7.8.win32/lib)
add_executable(time_table ${SOURCE_FILES})
target_link_libraries(time_table libxml2)

and this is what I get:

"C:\Program Files (x86)\JetBrains\CLion 1.1.1\bin\cmake\bin\cmake.exe" --build C:\Users\Gal\.clion11\system\cmake\generated\2eda76ff\2eda76ff\Debug --target time_table -- -j 8
[ 14%] Linking C executable time_table.exe
c:/mingw/bin/../lib/gcc/mingw32/4.8.1/../../../../mingw32/bin/ld.exe: cannot find -llibxml2
collect2.exe: error: ld returned 1 exit status
mingw32-make.exe[3]: *** [time_table.exe] Error 1
CMakeFiles\time_table.dir\build.make:225: recipe for target 'time_table.exe' failed
CMakeFiles\Makefile2:66: recipe for target 'CMakeFiles/time_table.dir/all' failed
mingw32-make.exe[2]: *** [CMakeFiles/time_table.dir/all] Error 2
CMakeFiles\Makefile2:78: recipe for target 'CMakeFiles/time_table.dir/rule' failed
mingw32-make.exe[1]: *** [CMakeFiles/time_table.dir/rule] Error 2

What is wrong?

like image 992
Gal Pressman Avatar asked Oct 09 '15 21:10

Gal Pressman


2 Answers

There is a key work for libraries installed on your machine. <lib_name>_INCLUDE_DIR and <lib_name>_LIBRARIES once you have done find_package. This works for me.

find_package(LibXml2 REQUIRED)
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/<my_stuff> ${LIBXML2_INCLUDE_DIR})
add_executable(<my_exe> <my_source_files>)
target_link_libraries(<my_exe> ${LIBXML2_LIBRARIES})

---- Just a note for your curiosity ----

If you ever needed to build (1) a (static) library of your calculations, maybe reusable, and (2) an executable that uses that library and LIBXML2, do this.

find_package(LibXml2 REQUIRED)

# add a calculation library: file "lib<mycalc>.a"
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/<your header files folder> ${LIBXML2_INCLUDE_DIR})
add_library(<mycalc> STATIC ${CMAKE_CURRENT_SOURCE_DIR}/<your src files folder>)
target_link_libraries(<mycalc> ${LIBXML2_LIBRARIES}) 

# add the executable: file <my_exe>
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/<your header files folder> ${LIBXML2_INCLUDE_DIR})
add_executable(<my_exe> <your exe src files>)
target_link_libraries(<my_exe> <mycalc> ${LIBXML2_LIBRARIES}) 
like image 57
angelo.mastro Avatar answered Nov 12 '22 03:11

angelo.mastro


Assume that full path to the library(.lib) can be expressed as

<library_dir>/<library_name>.lib

For compile executable, which uses this library, you need:

CMakeLists.txt:

link_libraries(<library_dir>)

add_excutable(<my_exe> ..)
target_link_libraries(<my_exe> <library_name>)

For use(run) compiled executable, you need to have <library_name>.dll either under one of the directory, listed in the PATH environment variable, or within same directory with executable.

like image 1
Tsyvarev Avatar answered Nov 12 '22 03:11

Tsyvarev