“Undefined reference to …” How can I find the library to link to?

“Undefined reference to …” How can I find the library to link to?

The most panicking error among all the make errors is the undefined reference error, which is mostly cause by an unlinked library.

For instance, here I forget to link to OpenGL glfw on purpose, so gcc reports the error as following:

main.o: In function `Update':
main.cpp:375: undefined reference to `glfwGetCursorPos'
main.cpp:377: undefined reference to `glfwSetCursorPos'
main.o: In function `AppMain()':
main.cpp:400: undefined reference to `glfwSetErrorCallback'
main.cpp:405: undefined reference to `glfwWindowHint'
main.cpp:406: undefined reference to `glfwWindowHint'
main.cpp:407: undefined reference to `glfwWindowHint'
main.cpp:408: undefined reference to `glfwWindowHint'
main.cpp:409: undefined reference to `glfwWindowHint'
main.cpp:410: undefined reference to `glfwCreateWindow'
main.cpp:415: undefined reference to `glfwSetInputMode'
main.cpp:416: undefined reference to `glfwSetCursorPos'
main.cpp:417: undefined reference to `glfwSetScrollCallback'
main.cpp:418: undefined reference to `glfwMakeContextCurrent'
main.cpp:494: undefined reference to `glfwSetWindowShouldClose'
main.cpp:475: undefined reference to `glfwWindowShouldClose'
error: ld returned 1 exit status

Most of the time, these errors are not bugs in our code, they’re just unlinked libraries. We call a function in our code, however the compiler cannot determine the next instruction under that it cannot find the real part(entry) of the function.

Therefore, I wrote a simple shell script that might help us find the undefined reference, the unknown library.

Here’s the script:

function findundef() {
    [ -z "$1" ] || [ -z "$2" ] && {
        echo "usage: findundef 'library_dir' 'undefined_symbol'"
        echo "'library_dir' can be separated by ':'"
        return 1

    local libraryDir
    libraryDir=($(echo "$1" | tr ":" " "))

    for i in "${libraryDir[@]}"; do
        find "$i" -type f -regextype posix-egrep -iregex '(.*\.)((a)|(so))' \
          -exec nm -gAC --defined-only {} 2>>/tmp/findundef.err \; \
            | grep "$2"

    [ "$?" -ne 0 ] && cat /tmp/findundef.err

    rm -f /tmp/findundef.err
    unset libraryDir

Let’s first take our example as a tutorial and let’s find the function glfwGetCursorPos

$ findundef "/usr/lib/:/usr/local/lib/" "glfwGetCursorPos"

Here’s the output of the run:



Using CMake and C++11 With Eclipse

Eclipse is a Good IDE for C++.

And, CMake is a useful Makefile generation tool.

We hope that we might integrate them together.

1 Quick Start with Old Projects

mkdir buildeclipse
cd buildeclipse/
cmake ../SOURCE_FILES/ -G"Eclipse CDT4 - Unix Makefiles"\


If you get an error of like this:

Could not determine Eclipse version, assuming at least 3.6 (Helios). Adjust CMAKE_ECLIPSE_VERSION if this is wrong.


2 A Project Example


# Optional
# or SET(_ECLIPSE_VERSION 4.3). If you add these, you may omit `-DCMAKE_ECLIPSE_VERSION=4.3`

ADD_EXECUTABLE(main main.cpp)



CMake:Eclipse UNIX Tutorial


Qt 5.1.0 on Ubuntu Linux, MySQL database connection problem, driver not loaded problem

Qt 5.1.0 on Ubuntu Linux, MySQL database connection problem, driver not loaded problem

Problem description

QSqlDatabase: QMYSQL driver not loaded
QSqlDatabase: available drivers: QSQLITE QMYSQL QMYSQL3 QPSQL QPSQL7

Read more

Ubuntu 12.04 Install Gazebo ROS Package (gazebo_ros_pkgs) 1.9 From source

Ubuntu 12.04 Install Gazebo ROS Package (gazebo_ros_pkgs) 1.9 From source

Read more

使用boost python的hello tutorial

安裝BOOST: http://www.boost.org/doc/libs/1_54_0/more/getting_started/index.html

增加C++的include directory使之能找到pyconfig.h等文件。

>> export CPLUS_INCLUDE_PATH=/usr/include/python2.7/:$CPLUS_INCLUDE_PAYH


>> cat hello.cpp

#include <iostream>

using namespace std;

void say_hello(const char* name) {
    cout << "Hello " <<  name << "!\n";

int main(){return 0;}

#include <boost/python/module.hpp>
#include <boost/python/def.hpp>
using namespace boost::python;

    def("say_hello", say_hello);

>> g++ hello.cpp -lboost_python -lpython2.7 -shared -fPIC -o hello.so
>> ls

>> python
Python 2.7.3 (default, Apr 10 2013, 06:20:15)
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import hello
>>> hello.say_hello('Bill')
Hello Bill!