[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: static cross-compiling


Hey there Jeremy!

Thanks for your help! I tried what you wrote me. I've adapted the
CmakeLists.txt you suggested to this:
cmake_minimum_required(VERSION 3.0.2)
project(sshtest)
find_package(OpenSSL)
add_subdirectory("libssh-0.7.5" libssh)
set (srcs sshtest.c)
add_executable(sshtest ${srcs})
target_link_libraries(sshtest ssh)

Which works half way, but make breaks with an error of config.h not
found on every source file of the libssh library that includes that
file. I found that I can work around that by replacing the line
#include "config.h"
with
#include "libssh/config.h"
but that seems bad (to modify the libssh source to make it build in my
setup). Is there an alternative?

Thanks,
Regards,
Thomas K.


2017-09-22 22:56 GMT+02:00 Jeremy Cross <JCross@xxxxxxxxxx>:
> Ideally you'd make your own CMakeLists.txt for your executable, and in it you'd call add_directory(<path to libssh's CMakeLists.txt>) so that you can get it to search for the dependencies and set the link lines for you.
>
> A CMake tutorial is bigger than I'm willing to take on here, but an untested simple starter one could look like this:
>
> cmake_minimum_required(VERSION 3.0.2)
> project(sshtest)
> find_package(OpenSSL)
> add_subdirectory_once("path/to/libssh" libssh)
> set (srcs sshtest.c)
> add_executable(sshtest ${srcs})
> target_link_libraries(sshtest libssh)
>
> -----Original Message-----
> From: Thomas Käfer [mailto:kaefert@xxxxxxxxx]
> Sent: Friday, September 22, 2017 1:41 PM
> To: libssh@xxxxxxxxxx
> Subject: Re: static cross-compiling
>
> thanks for the reply jeremy!
>
> Yes I've found this option and was able to generate a libssh.a file.
> but how do I use this?
>
> $ gcc sshtest.c libssh.a -o sshtest.x64 -static doesn't look very promising (see attached log)
>
>
> 2017-09-22 22:33 GMT+02:00 Jeremy Cross <JCross@xxxxxxxxxx>:
>> Sure, there's a WITH_STATIC_LIB option on the cmake.
>>
>> Try something like:
>> cmake -DWITH_EXAMPLES=OFF -DBUILD_SHARED_LIBS=OFF -DWITH_STATIC_LIB=ON -DOPENSSL_ROOT_DIR="<your path here>"
>>
>> -----Original Message-----
>> From: Thomas Käfer [mailto:kaefert@xxxxxxxxx]
>> Sent: Friday, September 22, 2017 1:27 PM
>> To: libssh@xxxxxxxxxx
>> Subject: Re: static cross-compiling
>>
>> I tried to recursively (manually..) follow the errors and install the dev packages and include the libraries with the "-lname" parameter to my gcc line, but this is getting out of hand. It doesn't look like I'll ever reach an end:
>>
>> $ gcc sshtest.c -lssh -lcrypto -lz -lgss -lshishi -ltasn1 -lidn
>> -lgcrypt -o sshtest.x64 -static (output see attached file)
>>
>> there must be some better easier way? I'm more of a java developer and there we have maven or other build systems to pull in requirements for building - can I use cmake or something else to walk those dependency paths for me instead of having to do this manually?
>>
>> 2017-09-21 23:11 GMT+02:00 Jeremy Cross <JCross@xxxxxxxxxx>:
>>> Your output indicates that you are missing symbols during the linking. The symbol names (like BN_new) are from OpenSSL, which would indicate that you are not properly including OpenSSL libraries in your linking. Depending on your configuration there may be other libraries you also need to be linking in...
>>>
>>> -----Original Message-----
>>> From: Thomas Käfer [mailto:kaefert@xxxxxxxxx]
>>> Sent: Thursday, September 21, 2017 1:25 PM
>>> To: libssh@xxxxxxxxxx
>>> Subject: Re: static cross-compiling
>>>
>>> I'm sorry, I forgot to mention that I did read http://api.libssh.org/master/libssh_linking.html and tried to put "#define LIBSSH_STATIC 1" and "#define LIBSSH_STATIC" before my include libssh line but it didn't seem to make a difference..?
>>>
>>> Ah. okey. I've found this link now:
>>> https://stackoverflow.com/questions/21083052/cross-compiling-for-arm-
>>> w hile-linking-to-libssh-libssh-so-file-not-recognized
>>>
>>> So if that's correct I need to cross-compile libssh and it's dependencies openssl and zlib for arm first, and can then using those prepared arm lib binaries compile a static build of my program. I will try to work on that next. Or have a look "embedded Linux distros like Buildroot, OpenEmbedded or Embedded Debian Project" to see if I find ready made arm binaries I can use?
>>>
>>> 2017-09-21 19:06 GMT+02:00 Thomas Käfer <kaefert@xxxxxxxxx>:
>>>> Hello!
>>>>
>>>> I would like to write a program that I can cross-compile for Android
>>>> and OpenWRT devices, that uses libssh to first talk to ssh servers
>>>> and in a later development-stage to each other.
>>>>
>>>> Sadly, I'm not really too experienced in programming C / C++, so
>>>> please bear with me.
>>>>
>>>> I found this tutorial
>>>> http://jensd.be/800/linux/cross-compiling-for-arm-with-ubuntu-16-04-
>>>> l t s which with the additional install of the package
>>>> "libc6-armel-cross"
>>>> enabled me to cross-compile a program that prints "hello world" in a
>>>> shell on my android device.
>>>>
>>>> Next step: After installing the package "libssh-dev" I was able to
>>>> use sample code from
>>>> http://api.libssh.org/master/libssh_tutor_guided_tour.html
>>>> to compile a dynamically linked program that works on my Linux laptop.
>>>>
>>>> Now the step I have been struggling with for the last few hours is
>>>> to compile this sample program that uses libssh in a static manner
>>>> (and once that is accomplished doing so using the "arm-linux-gnueabi-gcc"
>>>> cross-compiler)
>>>>
>>>> So I tried:
>>>> $ gcc sshtest.c -static -lssh
>>>> /usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/libssh.a(misc.c.o):
>>>> In function `ssh_path_expand_tilde':
>>>> (.text+0x87d): warning: Using 'getpwnam' in statically linked
>>>> applications requires at runtime the shared libraries from the glibc
>>>> version used for linking
>>>> /usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/libssh.a(misc.c.o):
>>>> In function `ssh_get_user_home_dir':
>>>> (.text+0x3a): warning: Using 'getpwuid_r' in statically linked
>>>> applications requires at runtime the shared libraries from the glibc
>>>> version used for linking ...
>>>> /usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/libssh.a(gssapi.c.o):
>>>> In function `ssh_packet_userauth_gssapi_token_client':
>>>> (.text+0x1b36): undefined reference to `gss_init_sec_context'
>>>> /usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/libssh.a(gssapi.c.o):
>>>> In function `ssh_packet_userauth_gssapi_token_client':
>>>> (.text+0x1c20): undefined reference to `gss_get_mic'
>>>> collect2: error: ld returned 1 exit status
>>>>
>>>> Then I downloaded the libssh source package and made a static build
>>>> of the library using the ccmake gui to set the static parameter to true.
>>>> With this I tried:
>>>> $ gcc sshtest.c libssh-0.7.5/build/src/libssh.a -lssh
>>>> libssh-0.7.5/build/src/libssh.a(curve25519.c.o): In function
>>>> `ssh_curve25519_build_k':
>>>> curve25519.c:(.text+0x13a): undefined reference to `BN_new'
>>>> curve25519.c:(.text+0x1e9): undefined reference to `BN_bin2bn'
>>>> libssh-0.7.5/build/src/libssh.a(dh.c.o): In function `ssh_get_random':
>>>> ...
>>>> libssh-0.7.5/build/src/libssh.a(bignum.c.o): In function `ssh_print_bignum':
>>>> bignum.c:(.text+0x175): undefined reference to `BN_bn2hex'
>>>> bignum.c:(.text+0x1dc): undefined reference to `CRYPTO_free'
>>>> collect2: error: ld returned 1 exit status
>>>>
>>>>
>>>> Now I'm out of ideas or in other words my googling skills are not
>>>> sufficient to find new ones ;) Please help..
>>>> Kind regards,
>>>> Thomas K.
>>>

Follow-Ups:
Re: static cross-compilingJeremy Cross <JCross@xxxxxxxxxx>
References:
static cross-compilingThomas Käfer <kaefert@xxxxxxxxx>
Re: static cross-compilingThomas Käfer <kaefert@xxxxxxxxx>
RE: static cross-compilingJeremy Cross <JCross@xxxxxxxxxx>
Re: static cross-compilingThomas Käfer <kaefert@xxxxxxxxx>
RE: static cross-compilingJeremy Cross <JCross@xxxxxxxxxx>
Re: static cross-compilingThomas Käfer <kaefert@xxxxxxxxx>
RE: static cross-compilingJeremy Cross <JCross@xxxxxxxxxx>
Archive administrator: postmaster@lists.cynapses.org