阿里云语音处理iot
这个sdk编译有一点小小的问题.搞了了我两天,奈何技术实力没过关.
一直没搞定.
先看错误结果

一直觉得dlopen 很熟悉,突然发现自己犯了一个错误.linux 网络编程中 关于dlopen的描述的在特定的时间打开动态库,或者是链接动态库吧.唉这就是年少吧,我也不年轻了... ...

[ 94%] Built target nlsUnity
[ 97%] Linking CXX executable nls-service
../lib/libcrypto.a(dso_dlfcn.o):在函数‘dlfcn_globallookup’中:
dso_dlfcn.c:(.text+0x11):对‘dlopen’未定义的引用
dso_dlfcn.c:(.text+0x24):对‘dlsym’未定义的引用
dso_dlfcn.c:(.text+0x2f):对‘dlclose’未定义的引用
../lib/libcrypto.a(dso_dlfcn.o):在函数‘dlfcn_bind_func’中:
dso_dlfcn.c:(.text+0x334):对‘dlsym’未定义的引用
dso_dlfcn.c:(.text+0x3db):对‘dlerror’未定义的引用
../lib/libcrypto.a(dso_dlfcn.o):在函数‘dlfcn_bind_var’中:
dso_dlfcn.c:(.text+0x454):对‘dlsym’未定义的引用
dso_dlfcn.c:(.text+0x4fb):对‘dlerror’未定义的引用
../lib/libcrypto.a(dso_dlfcn.o):在函数‘dlfcn_load’中:
dso_dlfcn.c:(.text+0x569):对‘dlopen’未定义的引用
dso_dlfcn.c:(.text+0x5cb):对‘dlclose’未定义的引用
dso_dlfcn.c:(.text+0x603):对‘dlerror’未定义的引用
../lib/libcrypto.a(dso_dlfcn.o):在函数‘dlfcn_pathbyaddr’中:
dso_dlfcn.c:(.text+0x68f):对‘dladdr’未定义的引用
dso_dlfcn.c:(.text+0x6f1):对‘dlerror’未定义的引用
../lib/libcrypto.a(dso_dlfcn.o):在函数‘dlfcn_unload’中:
dso_dlfcn.c:(.text+0x742):对‘dlclose’未定义的引用
collect2: error: ld returned 1 exit status
demo/CMakeFiles/nls-service.dir/build.make:95: recipe for target 'demo/nls-service' failed
make[2]: *** [demo/nls-service] Error 1
CMakeFiles/Makefile2:85: recipe for target 'demo/CMakeFiles/nls-service.dir/all' failed
make[1]: *** [demo/CMakeFiles/nls-service.dir/all] Error 2
Makefile:127: recipe for target 'all' failed
make: *** [all] Error 2

objdump -D ***.a > 1.txt
这条命令有什么作用呢???
应该最少显示了链接库里面的 函数的存在性.
拿说明库里函数是存在的,链接文件的时候没有链接进入.


file libopus.so 
libopus.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=ea0be73704dc2e8cd58d33333f76aa0572db9258, not stripped

说明这个的架构是64位台式机的架构.
请问如何看出.a 的架构呢??
libcrypto.a: current ar archive 这句话好像就说了是一个ar 连接的结构... 怎么看呢??
看来iot不是真正存在的.或者说如果我们要使用iot的架构的话.我们一定要重新编译出对应的库.
看来官方的cmke 写的不是特别行... ...

由于本人的水平比较渣... ... 没能搞明白问题出在哪里.
我原来是这么想的.可能是库的版本不对.
同事老司机就开了一波车.
老司机开了啥车呢??
grep -nsr "libnlsUnity.a"
然后老司机发现了这个.
demo/CMakeFiles/nls-service.dir/link.txt:1:/usr/bin/c++ -std=c++11 -pthread -D_GNU_ -DLOG_ON -std=gnu++11 -lpthread -ldl -lssl -lcrypto -lopus CMakeFiles/nls-service.dir/main.o -o nls-service -L../lib -L/home/liyj/Desktop/ailibaba/iot/IoT-device/build/lib -rdynamic ../lib/libnlsUnity.a -lssl -lcrypto -lopus -Wl,-rpath,../lib
这个很显然是一个 连接命令. 加入 -lopus -ld 问题得以解决.
然后再 make 编译通过.

改写的cmake

cmake_minimum_required(VERSION 2.0)
project(nls-service)

if(WIN32)
message("this operation platform is windows")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -D_WINDOWS_COMPILE_")
elseif(UNIX)
message("this operation platform is UNIX")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -pthread -D_GNU_ -DLOG_ON -ldl -lopus")
endif()

add_subdirectory(demo)
add_subdirectory(nls-service)
cmake_minimum_required(VERSION 2.0)
project(nls-service)

if(WIN32)
message("this operation platform is windows")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -D_WINDOWS_COMPILE_ -DUNICODE -D_CRT_SECURE_NO_WARNINGS")
elseif(UNIX)
message("this operation platform is UNIX")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++11 -lpthread -ldl -lssl -lcrypto -lopus")
endif()


include_directories(../include)
if(WIN32)
	link_directories(../../lib/win/$(Platform))
elseif(UNIX)
	link_directories(../lib)
endif()
aux_source_directory(. DIR_LIB_SRCS)
add_executable(nls-service ${DIR_LIB_SRCS})
target_link_libraries(nls-service nlsUnity)	
if(WIN32)
	target_link_libraries(nls-service libeay32)
	target_link_libraries(nls-service ssleay32)
	target_link_libraries(nls-service opus)
elseif(UNIX)
	target_link_libraries(nls-service ssl)
	target_link_libraries(nls-service crypto)
	target_link_libraries(nls-service dl)
	target_link_libraries(nls-service opus)
endif()

智能问答服务,

一定要选择发布而不是预发布
否则就会出现这样的错误

https://help.aliyun.com/document_detail/50473.html?spm=5176.doc50410.6.593.iFH7la
观阿里云给出的接口.看出很多的操作可以通过curl传递参数的方式操作.无论是提交项目的参数还是发布都有相应的接口.

posted on 2017-11-24 14:02  HDU李少帅  阅读(473)  评论(0编辑  收藏  举报