Skip to content

Problem using abseil with libtorch #1429

@zizhang-qiu

Description

@zizhang-qiu

Describe the issue

If i use abseil and libtorch together, and use the function like StrAppend, the build will fail and give errors like

undefined reference to `absl::StrCat(absl::AlphaNum const&, absl::AlphaNum const&, absl::AlphaNum const&)'

Steps to reproduce the problem

My Cmakelist is like

cmake_minimum_required(VERSION 3.25)
project(simple_tests)
set(ABSL_PROPAGATE_CXX_STD ON)
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
set(CMAKE_CXX_STANDARD 17)
set(_GLIBCXX_USE_CXX11_ABI 0)
set(CONDA_PREFIX "/home/qzz/.conda/envs/bridge_research/")
set(PYTHON_EXECUTABLE "${CONDA_PREFIX}/bin/python")
set(PYTHON_INCLUDE_DIR "${CONDA_PREFIX}/include/python3.8")
set(PYTHON_LIBRARIES "${CONDA_PREFIX}/lib/libpython3.so")
set(CMAKE_CUDA_COMPILER "/usr/local/cuda-11.7/bin/nvcc")
set(CMAKE_CUDA_ARCHITECTURES 86)
find_package(PythonInterp REQUIRED)
find_package(PythonLibs REQUIRED)
set(TorchPath /home/qzz/.conda/envs/bridge_research/lib/python3.8/site-packages/torch)
message(STATUS TorchPath=${TorchPath})


list(APPEND CMAKE_PREFIX_PATH ${TorchPath})

find_package(Torch REQUIRED)
set(TORCH_PYTHON_LIBRARIES  "${TorchPath}/lib/libtorch_python.so")
add_subdirectory(third_party/abseil-cpp)
add_subdirectory(third_party/pybind11)

add_library(t SHARED absl_simple_tests.h)
target_link_libraries(t PUBLIC
        absl::base
        absl::algorithm
        absl::flags
        absl::optional
        absl::random_random
        absl::strings
        absl::str_format
        absl::time
        ${TORCH_LIBRARIES}
        )

target_include_directories(t PUBLIC
        ${TORCH_INCLUDE_DIRS}
        ${CMAKE_CURRENT_SOURCE_DIR}
        third_party/abseil-cpp
        third_party/)

add_executable(simple_tests main.cpp)
target_link_libraries(simple_tests PUBLIC t)

The file absl_simple_tests.h is

#include "absl/strings/str_cat.h"

#ifndef SIMPLE_TESTS_ABSL_SIMPLE_TESTS_H
#define SIMPLE_TESTS_ABSL_SIMPLE_TESTS_H

std::string TestStrCat() {
    std::string s1;
    s1 = absl::StrCat("A string ", " another string", "yet another string");
    return s1;
}

std::string TestStrAppend() {
    std::string s = "foo";
    absl::StrAppend(&s, "123");
    return s;
}



#endif //SIMPLE_TESTS_ABSL_SIMPLE_TESTS_H

The file main.cpp is like

#include <iostream>
#include "absl_simple_tests.h"
#include "torch/torch.h"


int main() {
    auto s = TestStrCat();
    std::cout << s << std::endl;
    s = TestStrAppend();
    std::cout << s << std::endl;
    std::cout << torch::eye(3) << std::endl;
    return 0;
}

If i build this, I will get errors:

/usr/bin/ld: CMakeFiles/simple_tests.dir/main.cpp.o: in function `TestStrCat()':
main.cpp:(.text+0xc3): undefined reference to `absl::StrCat(absl::AlphaNum const&, absl::AlphaNum const&, absl::AlphaNum const&)'
/usr/bin/ld: CMakeFiles/simple_tests.dir/main.cpp.o: in function `TestStrAppend()':
main.cpp:(.text+0x1a4): undefined reference to `absl::StrAppend(std::string*, absl::AlphaNum const&)'
collect2: error: ld returned 1 exit status
ninja: build stopped: subcommand failed.

I have tested libtorch and abseil seperately, they all worked successfully.
The libtorch is just torch2.0.

What version of Abseil are you using?

d722803

What operating system and version are you using?

ubuntu22.04

What compiler and version are you using?

gcc 11.3.0

What build system are you using?

cmake 3.25.2

Additional context

No response

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions