我发现有些图书馆链接到librt.so,而其他图书馆则没有。我想知道它是在什么情况下链接的。
我从来没有直接使用过这个库。有没有演示显示它的直接用法?有没有相关的头文件?
我在 Ubuntu 14.04 下使用 CMake 来配置我的项目。我需要使用第三方库(比如 stuff.so)。在 CMakeLists.txt 中,我使用 TARGET_LINK_LIBRARIES 链接内容库。但是,我收到一个错误:
DIR_TO_LIB/stuff.so:-1: 错误: 未定义对 `shm_open' 的引用
我尝试将这些标志放入 CMakeLists.txt 但它不起作用:
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -lrt")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -lrt")
Run Code Online (Sandbox Code Playgroud)
一篇文章(链接)说 -lrt 应该作为 g++ 的最后一个参数。在我使用 CMake 的情况下,我该怎么做?
更新:我添加了
SET (CMAKE_VERBOSE_MAKEFILE 1)
Run Code Online (Sandbox Code Playgroud)
我发现 -lrt 不是最后一个(即使我把它放在目标链接的末尾)。请参阅此链接以获取编译输出。
从编译输出中可以看到,opencv 有一些链接标志。我不明白为什么会发生这种情况,因为我首先在 TARGET_LINK_LIBRARIES 中链接 OpenCV 库。CMake 如何处理这些链接顺序?
另请参阅我的CMakeLists.txt。
谢谢。
我真的想把更多的东西放在身上来解释这个问题......但标题真的涵盖了这一切.据我所知,librt更"官方"(它是标准的一部分libc?),但我也记得看到Node.js使用libeio.我应该花更多的时间研究一下?便携性怎么样?他们的API有何不同?
(如果有一个代表≥1,500的人可以在这个问题上添加标签"libeio"和"librt",我会很感激,因为我不能.)
我刚从@ tony-d 找到了这个答案,用一个基准代码来测试虚函数调用开销.我查了基准使用g++:
$ g++ -O2 -o vdt vdt.cpp -lrt
$ ./vdt
virtual dispatch: 150000000 0.128562
switched: 150000000 0.0803207
overheads: 150000000 0.0543323
...
Run Code Online (Sandbox Code Playgroud)
我的表现更好(他的比例约为2),但后来我查了一下clang:
$ clang++-3.7 -O2 -o vdt vdt.cpp -lrt
$ ./vdt
virtual dispatch: 150000000 0.462368
switched: 150000000 0.0569544
overheads: 150000000 0.0509332
...
Run Code Online (Sandbox Code Playgroud)
现在这个比例上升到70左右!
然后我注意到了-lrt命令行参数,经过一些谷歌搜索后,librt我尝试了没有它g++和clang:
$ g++ -O2 -o vdt vdt.cpp
$ ./vdt
virtual dispatch: 150000000 0.4661
switched: 150000000 0.0815865
overheads: 150000000 0.0543611
...
$ …Run Code Online (Sandbox Code Playgroud) 在NDK-build上获得以下错误
/ndk-bundle/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/lib/gcc/arm-linux-androideabi/4.9.x /../../../../ arm-linux -androideabi/bin/ld:错误:找不到-lrt
我更新了Android.mk以获取lrt的绝对路径,但问题没有解决
我的Android.mk就在这里
LOCAL_PATH := $(call my-dir)
THIS_PATH := $(LOCAL_PATH)
include $(CLEAR_VARS)
OPENCV_CAMERA_MODULES := off
OPENCV_INSTALL_MODULES := off
OPENCV_LIB_TYPE := STATIC
OPENCV_ANDROID_SDK_HOME := /home/Ravikant/Desktop/OpenCV-android-sdk
include $(OPENCV_ANDROID_SDK_HOME)/sdk/native/jni/OpenCV.mk
OPENCV_INCLUDE_DIR := $(OPENCV_ANDROID_SDK_HOME)/sdk/native/jni/include
OPENCV_LIBS_DIR := $(OPENCV_ANDROID_SDK_HOME)/sdk/native/libs/$(TARGET_ARCH_ABI)
OPENCV_3RD_PARTY_LIBS_DIR := $(OPENCV_ANDROID_SDK_HOME)/sdk/native/3rdparty/libs/$(TARGET_ARCH_ABI)
LOCAL_MODULE := myModule
LOCAL_CFLAGS := -w
LOCAL_SRC_FILES := searchPath.cpp auxiliary.cpp
LOCAL_LDFLAGS := -fopenmp -llog -ljnigraphics -L$(OPENCV_LIBS_DIR)
LOCAL_SHARED_LIBRARIES += prebuilt_for_opencv_java
-lopencv_core \
-lopencv_highgui \
-lopencv_objdetect \
-lopencv_imgproc \
-lopencv_imgcodecs \
-lopencv_photo
include $(BUILD_SHARED_LIBRARY)
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := prebuilt_for_opencv_java …Run Code Online (Sandbox Code Playgroud)