I couldn’t find a nix community, so I’m hoping it is ok that I’m posting on the nixos one instead. I’ll switch to mailing list/discord if necessary, but I have a lemmy app on my phone, and it is much easier to have an ongoing conversation from here, so I decided to give it a shot. Here goes!

While I have a NixOS laptop, I primarily use other systems (e.g. OpenSuse Tumbleweed) as of now.

I love the ability to define the packages I want installed, with home-manager managing my command line utilities (e.g mtr, dig, protobuf etc).

I’ve been playing around a bit with protobuf recently, and after generating some c++ code using protoc, I loaded up the generated code in vscode, which understandably wasn’t able to find the development headers for protobuf (since they are in the nix store - /nix/store/h2h5fs8iv2a8rmlkfhr6id6y4jxwd5i1-protobuf-3.21.12/include/google/protobuf/io)

I tried to compile the code anyways on the command line, and got some errors.

I might need an OS specific protobuf install just for the development headers, but I’m pretty sure I should be able to, and just don’t know how. Here’s what I get when I try to compile:

$ g++ searchReq.pb.cc
In file included from searchReq.pb.cc:4:
searchReq.pb.h:10:10: fatal error: google/protobuf/port_def.inc: No such file or directory
   10 | #include 
      |          ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
compilation terminated.

Any tips/pointers would be appreciated. Thanks in advance!

===========================================

Edit: Thank you all, particularly @Xephopiqua@lemmy.ml and @chayleaf@lemmy.ml for the help. After setting the include path (compile) and LD_LIBRARY_PATH (link), things work great.

I ended up writing a small Makefile for convenience in the short run:

INC_FLAGS:=-I$(HOME)/.nix-profile/include -Icpp
LD_FLAGS:=-L$(HOME)/.nix-profile/lib -l protobuf

run: task
	LD_LIBRARY_PATH=$(HOME)/.nix-profile/lib ./task

task:
	g++ $(LD_FLAGS) $(INC_FLAGS) main.cpp cpp/searchReq.pb.cc -o task

regen:
	protoc --python_out=python --cpp_out=cpp searchReq.proto

That’s enough to get me going for now.

TODO - read up the NIXOs Wiki C page in more detail

  • GravelPieceOfSword@lemmy.caOP
    link
    fedilink
    arrow-up
    1
    ·
    1 year ago

    I had protobuf installed via home-manager and gcc/g++ installed via the same.

    Before posting, I had tried with both the globally installed g++ (full path specified manually to override nix one), as well as the nix store installed one. Both gave errors: one with more (the non-nix one) - I got the error I posted originally in my nix install.

    I have the native distro packages installed (removed from home-manager for now to keep things sane), but I’d like to get that working too, and understand what’s going on.

    To add more information, after posting originally, I spun up my Nixos laptop and tried using protobuf there after I got a python native setup for test code.

    The same code errored out on Nixos, even after regenerating the protobuf code locally using protoc. Python was unable to find the Google modules.

    I checked nixpkgs to see if there were additional packages besides protobuf that needed to be installed. I installed both python310Packages.protobuf and python311Packages.protobuf, but kept getting the same error (I can see the modules in the nix store).

    I don’t have access to my laptop right now, but I’m not sure if it’s related to environment variables in my dot config (I don’t override variables… I only append to them for variables such as PATH).

    • Xephopiqua@lemmy.ml
      link
      fedilink
      arrow-up
      1
      ·
      1 year ago

      AFAIK installing packages via HM does not automatically give you the right includes. Either set $NIX_CFLAGS_COMPILE (and potentially $NIX_LDFLAGS) manually (or pass -I argument to the compiler or use a development shell while declaring your inputs (protobuf) there. This will then automatically populate the aforementioned env variables automagically.