Golang ways to get header and link libraries automatically using Pkg-config

Source: Internet
Author: User
This is a creation in Article, where the information may have evolved or changed.

In order to be able to reuse the existing C language library, we will inevitably encounter go and C language mixed programming when using Golang development project or system, many people will choose to use CGO. Say CGO this thing can be considered to be a person to love and hate, the advantage is that it allows you to quickly reuse the existing C library, no need to re-build the wheel with Golang, and the downside is that it will to some extent weaken your system performance. About CGO's misdeeds, Dave Cheney the Great God has a special article on his blog, "CGO is not Go", interested students can take a look. But then again, sometimes in order to quickly develop to meet the needs of the project, the use of CGO is the last resort.

  when using CGO to call C libraries in Golang, if you need to refer to many different third-party libraries, then using #cgo CFLAGS: and #cgo Ldflags: will introduce many lines of code. First, this can lead to ugly code, and most importantly, if you are referencing a library that is not standard, the header file path and the library file path will be cumbersome to write to. Once the installation path of the third-party library changes, the Golang code changes, so the use of pkg-config is undoubtedly a more elegant approach, no matter how the library's installation path changes, we do not need to modify the Go code, The blogger then uses a simple example to illustrate how to use pkg-config in the CGO command.   First, suppose we install a third-party C-language library named Hello under Path/home/ubuntu/third-parties/hello, whose directory structure is shown below, in Hello_ World.h only defines an interface function Hello, which receives a char * string as a variable and invokes printf to print it to standard output.   # tree/home/ubuntu/third-parties/hello/ /home/ubuntu/third-parties/hello/ ├──include │└──hello_world.h └──lib ├──libhello.so └──pkgconfig └──hello.pc   To ensure that pkg-config can find this C language library, we will generate a description file for this library, which is lib/ Pkgconfig Directory of HELLO.PC, the contents of which are as follows, there is no understanding of the configuration file content of the spectators can go to search for pkg-config related documents.   # cat Hello.pc Prefix=/home/ubuntu/third-parties/hello Exec_prefix=${prefix} Libdir=${exec_prefix}/lib Includedir=${exec_prefix}/include Name:hello description:the Hello Library just for testing pkgconfig version:0.1 Libs:-lhello-l${libdir} Cflags:-i${includedir}   once the Pkg-config profile has been created, you will also need to add the path information for the profile to the PKG_CONFIG_PATH environment variable, so that pkg-config can correctly obtain information about the C-language library. In addition, we need to add the library file path of the C language library to the LD_LIBRARY_PATH environment variable, with the following specific commands:   # Export Pkg_config_path=/home/ubuntu/third-parties/hello/lib/pkgconfig # pkg-config--list-all | grep libhello Libhello libhello-the Hello Library just for testing pkgconfig # Export Ld_library_path=/home/ubuntu/third-parties/hello/lib   after completing the series of preparations, we can begin to write the Golang code, the following is the code example of Golang calling the C interface, we only need to #cgo Pkg-config:libhello and #include < h Ello_world.h > Two-line statements enable calls to the Hello function. If the installation path of the C language library changes, simply modify the HELLO.PC profile so that the Golang code does not need to be re-modified and compiled.   Package Main //#cgo Pkg-config:libhello //#include < stdlib.h > //#include < hello_world.h > import "C" Import ( "unsafe" ) Func Main () { msg: = "Hello, world!" cmsg: = c.cstring (msg) C.hello (cmsg) C.free (unsafe. Pointer (cmsg)) }   Finally, compile the program code to see if the executable program correctly links the C language library, and execute the program to verify that the library function function is called correctly.   # Go Build hello_world.go # LDD Hello_world linux-vdso.so.1 = (0x00007ffff63d3000) libhello.so =/home/ubuntu/third-parties/hello/lib/libhello.so (0x00007fc31c0e1000) libpthread.so.0 =/lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fc31bec3000) libc.so.6 =/lib/x86_64-linux-gnu/libc.so.6 (0x00007fc31bafe000) /lib64/ld-linux-x86-64.so.2 (0x00007fc31c2e3000) #./hello_world Hello, world!.   There are two places to focus in the above steps: 1) Create a pkg-config configuration file for the C language library and add the path of the configuration file to the environment variable Pkg_config_path; 2) The path to the C-language library file is added to the environment variable Ld_library_ Path, if you do not have this step, the Go Language program can be compiled successfully, but the executable file is not properly connected to the C language Library, the following situation occurs:   # LDD Hello_world linux-vdso.so.1 = (0x00007fffa49e2000) libhello.so = not found libpthread.so.0 =/lib/x86_64-linux-gnu/libpthread.so.0 (0x00007feb0fe93000) libc.so.6 =/lib/x86_64-linux-gnu/libc.so.6 (0x00007feb0face000) /lib64/ld-linux-x86-64.so.2 (0x00007feb100b1000)
Related Article

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.